繁体   English   中英

每个线程组的Pthread互斥锁

[英]Pthread mutex per thread group

我正在寻找正确的解决方案来保护线程组,就像我通常使用单个线程那样,即:线程1和2之一或两者都可以同时锁定互斥锁M,而1和2都不会进入睡眠状态。 互斥锁M抵靠线程3。因此,如果线程3在互斥锁被线程1或2或两者同时锁定时锁定了互斥锁,则线程3将进入休眠状态。 如果线程1或2在被线程3锁定时锁定了互斥锁,则1或2(以锁定状态为准)也将进入睡眠状态,直到3释放它为止。

谢谢。

如果您的意思是在关键部分中不希望有两个以上的线程,而在关键部分中保留了第三个线程,则必须使用POSiX Semaphore初始化为2。Semaphore计数器可以初始化为任何值,每个sem_wait减1计数器(锁定它),每个sem_post都会增加它(释放它)。 互斥锁是初始化为1.的信号量的特例。

或者,如果您想要一个写入线程和两个或更多读取器,则可以使用rwlocks。

但是我要阅读建议的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

也许,信号量以较少的麻烦方式允许相同的操作,我将检查...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM