使用条件变量实现自定义屏障

时间:2016-04-02 22:40:09

标签: c multithreading pthreads condition-variable busy-waiting

我在C中实现了pthread_barrier_wait的自定义版本。在我的第一个简单实现中,我使用了锁和条件变量。但经过一些测试和研究后,我发现当我使用连续的barrier_wait调用时,它无法正常工作,因为它与pthread_barrier_wait一起使用。我尝试了另一种方法,使用我在互联网上找到的感知逆转算法。

int local_sense = 0;
void barrier_wait(barrier_t *b)
{
    local_sense = (local_sense == 0) ? 1 : 0;
    pthread_mutex_lock(&b->lock);
    int arrived = ++b->counter;
    if(arrived == b->threads)
    {
        pthread_mutex_unlock(&b->lock);
        b->counter = 0;
        b->flag = local_sense;
    }
    else
    {
        pthread_mutex_unlock(&b->lock);
        while(b->flag != local_sense){};
    }
}

看起来它工作正常,但我想让它与第一个条件变量一起工作。到目前为止,无论我尝试过什么,即使在简单的程有什么建议吗?

修改

我要做的是用条件变量替换忙等待

0 个答案:

没有答案