我正在寻找正确的解决方案来保护线程组,就像我通常对单个线程所做的那样,即:线程 1 和 2 中的一个或两个可以同时锁定互斥锁 M,1 和 2 都不会进入睡眠状态。互斥锁 M 与线程 3 相对。因此,如果线程 3 在线程 1 或 2 或两者都锁定互斥锁时锁定了互斥锁,则线程 3 将进入睡眠状态。如果线程 1 或 2 在被线程 3 锁定时锁定了互斥锁,那么 1 或 2(无论锁定它的哪一个)也会进入休眠状态,直到 3 释放它...
谢谢你。
如果你的意思是你不想在临界区中有两个线程,而第三个线程被保留在临界区之外,那么你必须使用初始化为 2 的 POSiX 信号量。信号量计数器可以初始化为任何值,每 sem_wait 递减计数器(锁定它),每个 sem_post 递增它(释放它)。互斥量是初始化为 1 的信号量的特殊情况。
如果你的意思是你想要一个写线程和两个或更多读者,你可以使用 rwlocks。
但是我要阅读建议的posix semaphore(这似乎是我想要的)我已经找到了以“旧方式”进行操作的方法: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
也许,信号量以不那么繁琐的方式允许相同,我会检查......