16 апреля 2009 г.

Задачи на собеседованиях: синхронизация

Предположим, что из доступных средств синхронизации у нас есть только бинарные семафоры (мьютексы). При этом семафоры поддерживают только операции lock() и unlock().

У нас есть разделяемый ресурс, который поддерживает операции чтения и записи. Существует N одновременно выполняющихся потоков, причем N — величина непостоянная. Одним потокам необходимо читать из разделяемого ресурса, другим необходимо записывать в этот ресурс.

Операция чтения может выполняться одновременно несколькими потоками, то есть когда один поток читает из ресурса, другие потоки тоже могут читать из этого ресурса, но писать в него не могут. Операция записи должна выполняться в эксклюзивном режиме, то есть во время записи никакие другие потоки не могут ни читать, ни писать.

Необходимо создать механизм синхронизации доступа к разделяемому ресурсу, который бы обеспечивал эксклюзивный доступ к ресурсу для записывающих потоков и одновременный доступ для читающих потоков, используя мьютексы. Количество используемых в решении мьютексов — на усмотрение разработчика.

После решения задачи, попытаться найти в решении недостатки и предложить более продвинутый вариант.

Подсказка:
Другими словами нужно самостоятельно реализовать аналог pthread_rwlock. Поэтому для начала нужно определить методы доступа к механизму синхронизации и отталкиваться уже от них. Например, пусть для потоков записи это будут функции writerLock() и writerUnlock(); для потоков чтения - readerLock() и readerUnlock(). Смысл этих функций аналогичен функциям lock() и unlock() для семафоров.