【问题标题】:Pthread mutex per thread group每个线程组的 Pthread 互斥锁
【发布时间】:2013-08-31 20:12:17
【问题描述】:

我正在寻找正确的解决方案来保护线程组,就像我通常对单个线程所做的那样,即:线程 1 和 2 中的一个或两个可以同时锁定互斥锁 M,1 和 2 都不能放入睡觉。互斥锁 M 与线程 3 相对。因此,如果线程 3 在线程 1 或 2 或两者都锁定互斥锁时锁定了互斥锁,则线程 3 将进入睡眠状态。如果线程 1 或 2 在被线程 3 锁定时锁定了互斥锁,那么 1 或 2(无论锁定它的哪一个)也会进入休眠状态,直到 3 释放它...

谢谢。

【问题讨论】:

  • or both can lock mutex M at the same time 是什么意思?只有一个线程锁定而另一个线程必须等待的互斥锁点

标签: c linux pthreads mutex


【解决方案1】:

如果你的意思是你不想在临界区中有两个线程,而第三个线程被保留在临界区之外,那么你必须使用初始化为 2 的 POSiX Semaphore。 信号量计数器可以初始化为任何值,每 sem_wait 递减计数器(锁定它),每 sem_post 递增它(释放它)。 互斥量是初始化为 1 的信号量的特例。

如果你的意思是你想要一个写入线程和两个或更多读取器,你可以使用 rwlocks。

【讨论】:

  • 嗯,实际上,rwlock 正是我所需要的。谢谢。
【解决方案2】:

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

也许,信号量允许以不那么繁琐的方式实现相同的功能,我会检查...

【讨论】:

    猜你喜欢
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多