【发布时间】: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,因为锁定的互斥锁。
我不完全确定这个互斥锁是如何工作的。
【问题讨论】:
-
在 Stackoverflow 上提问的人应该事先做基础研究。您的问题实际上不是关于您显示的代码,而是关于一般的互斥锁。你应该能够在网上找到很多关于它的信息。首先花时间阅读pthread man pages,如果理解,它将回答您的问题。
-
是的,我阅读了手册页 :) 但我不清楚,这就是我问这个问题的原因......所以我在这里实现的锁是有效的,不会按预期工作?它应该是怎样的?感谢您的时间
-
不清楚你的意图是什么。 “我不确定其他线程是否会进入 enterBarrier”。对此的答案是,一旦某个线程解锁了互斥锁,那么在锁上被阻塞的其他线程之一(如果有的话)将被解除阻塞并继续执行。这几乎正是手册页所说的内容。
-
barrier->cond = 1;甚至可以编译吗?如果是这样,它肯定没有意义或工作。barrier->cond = 0;也是如此。
标签: c multithreading pthreads mutex barrier