#c #многопоточность
День добрый. Есть некоторый разделяемый ресурс с операциями чтения/записи. Известно что операций чтения гораздо больше, чем записи. Как организовать доступ к такому объекту? Понятно, что можно просто использовать семафор, и блочить на каждый поток ресурс, вне зависимости чтение это или запись.
Ответы
Ответ 1
Может, вам нужен Readers–writer lock? Множество потоков могут читать Только один поток может писать Функции pthread: pthread_rwlock_init() pthread_rwlock_rdlock() pthread_rwlock_wrlock() pthread_rwlock_unlock() Winapi - SRW LocksОтвет 2
Если пишите под Unix, то можно использовать блокировку чтения-записи pthread_rwlock. Она работает следующим образом : захватить блокировку на чтение и "мониторить" ресурс без модификации данных смогут одновременно N потоков. Если же какой-либо из потоков захватывает блокировку на запись, то продолжить работу этот поток сможет тогда, когда не захвачено ни одной блокировки на чтение (читателей у ресурса в текущий момент нет). Пока поток эксклюзивно удерживает блокировку на запись, все остальные читатели и писатели ждут. Обычно, потоки-писатели находятся в приоритете, т.е. если какой-то из потоков ждет возможности записи, доступ новых читателей к ресурсу блокируется (чтобы поток-писатель не ожидал бесконечно) и они ждут, пока отработает поток-писатель. В некоторых реализациях эту приоритетность по идее можно менять. Если же Вы пишите под Windows, то, возможно, стоит обратить внимание на shared_mutex.
Комментариев нет:
Отправить комментарий