我正在用 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){};
}
}
看起来它工作正常,但我想让它与第一个一样的条件变量一起工作。到目前为止,即使在简单的程序中,我尝试过的任何东西都会给我带来奇怪的结果。有什么建议么?
编辑
我想做的是用条件变量代替忙碌的等待