我在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){};
}
}
看起来它工作正常,但我想让它与第一个条件变量一起工作。到目前为止,无论我尝试过什么,即使在简单的程有什么建议吗?
修改
我要做的是用条件变量替换忙等待