线程屏障同步[关闭]
Posted
技术标签:
【中文标题】线程屏障同步[关闭]【英文标题】:Thread Barrier synchronization [closed] 【发布时间】:2016-06-22 04:58:01 【问题描述】:我想在线程上实现屏障同步技术
到目前为止,我已经想出了一些代码,但我有一些问题..
struct _ThreadBarrier
pthread_cond_t cond;
int needed;
int waiting;
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
pthread_mutex_t mut;
some other code for initilization etc ..
void enterBarrier(ThreadBarrier *barrier)
pthread_mutex_lock(&barrier->mut);
waiting ++;
if (waiting == needed)
barrier->cond = 1;
barrier->waiting = 0;
pthread_cond_broadcast(&barrier->cond);
else
barrier->cond = 0;
pthread_cond_wait&barrier->cond,&barrier->mut);
pthread_mutex_unlock(&barrier->mult);
所以我对互斥体有一些疑问。我确信在进入函数时。 enterBarrier 我必须锁定互斥体,这样就没有其他线程得到它并改变它,同时“等待”!但是我解锁了互斥锁和代码的结尾,我不确定其他线程是否会进入 enterBarrier,因为锁定的互斥锁。
我不完全确定这个互斥锁是如何工作的。
【问题讨论】:
在 *** 上提问的人应该事先做基础研究。您的问题实际上不是关于您显示的代码,而是关于一般的互斥锁。你应该能够在网上找到很多关于它的信息。首先花时间阅读pthread man pages,如果理解,它将回答您的问题。 If the mutex is already locked, the calling thread shall block until the mutex becomes available. 是的,我阅读了手册页 :) 但我不清楚,这就是我问这个问题的原因......所以我在这里实现的锁是有效的,不会按预期工作?它应该是怎样的?感谢您的时间 不清楚你的意图是什么。 “我不确定其他线程是否会进入 enterBarrier”。对此的答案是,一旦某个线程解锁了互斥锁,那么在锁上被阻塞的其他线程之一(如果有的话)将被解除阻塞并继续执行。这几乎正是手册页所说的内容。barrier->cond = 1;
甚至可以编译吗?如果是这样,它肯定没有意义或工作。 barrier->cond = 0;
也是如此。
【参考方案1】:
应该是这样的。要锁定/解锁条件变量,需要函数。互斥锁应该在一开始就被锁定
void enterBarrier(ThreadBarrier *barrier)
pthread_mutex_lock(&barrier->mut);
barrier->waiting ++;
if (barrier->waiting == barrier->needed)
barrier->waiting = 0;
pthread_cond_broadcast(&barrier->cond);
else
pthread_cond_wait(&barrier->cond,&barrier->mut);
pthread_mutex_unlock(&barrier->mut);
【讨论】:
以上是关于线程屏障同步[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
AQS同步组件-CyclicBarrier(循环屏障)解析和用例