线程屏障同步[关闭]

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);

【讨论】:

以上是关于线程屏障同步[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

java CyclicBarrier同步屏障

Java并发工具类同步屏障CyclicBarrier

java中的简单屏障同步

AQS同步组件-CyclicBarrier(循环屏障)解析和用例

并发编程-AQS同步组件之 CyclicBarrier 同步屏障

在 C 中使用互斥锁和屏障进行线程同步