RWロックを使用します。RWロックでは、複数のリーダーと1つのライターのみが許可されます。ワーカーはクリティカルセクションの開始時にread-lockを呼び出し、メインスレッドはwrite-lockを呼び出します。
定義上、read-lockを呼び出すと、呼び出しプロセスは書き込みスレッドが終了するのを待ちます。write-lockを呼び出す場合、呼び出しプロセスは読み取りまたは書き込みスレッドが終了するのを待ちます。
POSIXスレッドの使用例:
pthread_rwlock_t lock;
/* worker threads */
void *do_work(void *args) {
for (int i = 0; i < 100; ++i) {
pthread_rwlock_rdlock(&lock);
// do some work...
pthread_rwlock_unlock(&lock);
sleep(1);
}
pthread_exit(0);
}
/* main thread */
int main(void) {
pthread_t workers[4];
pthread_rwlock_init(&lock);
int i;
// spawn workers...
for (i = 0; i < 4; ++i) {
pthread_create(workers[i]; NULL, do_worker, NULL);
}
for (i = 0; i < 100, ++i) {
pthread_rwlock_wrlock(&lock);
// do some work...
pthread_rwlock_unlock(&lock);
sleep(1);
}
return 0;
}