我正在寻找正确的解决方案来保护线程组,就像我通常用单个线程做的那样,即:线程1和2中的一个或两个可以同时锁定互斥锁M,1和2都不会被放入睡觉。 Mutex M代表线程3.因此,如果线程3在被线程1或2或两者锁定时锁定互斥锁,则线程3将进入休眠状态。如果线程1或2在被线程3锁定时锁定互斥锁,那么1或2(无论哪个锁定它)也会进入睡眠状态,直到3释放它...
谢谢。
答案 0 :(得分:0)
如果你的意思是你想要一个关键部分永远不会超过这两个线程,而第三个线程被保留在临界区之外,那么你必须使用初始化为2的POSiX信号量。 信号量计数器可以初始化为任何值,每个sem_wait递减计数器(锁定它),每个sem_post递增它(释放它)。 互斥体是信号量初始化为1的特殊情况。
如果你的意思是你想要一个作家线程和两个以上的读者,你可以使用rwlocks。
答案 1 :(得分:0)
但是我要阅读建议的posix信号量(这似乎是我想要的)我已经找到了以“旧时尚”的方式:Stevens UNP p。 703,使用pthread_cond,元代码将是这样的:
int var = 0;
pthread_mutex_t M;
pthread_cond_t C;
threadA: lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M
threadB: lock M; var++; unlock M; do_job; lock M; var--; cond_signal(&C); unlock M
thread Main: lock M; while (var > 0) cond_wait(&C, &M); do_protected_job; unlock M
也许,信号量允许不那么繁琐,我会检查......