可重复使用的屏障简单(交替)实施

时间:2017-09-26 11:29:21

标签: c++ multithreading c++11 barrier

std::mutex mutex;
std::condition_variable cv;
uint8_t size = 2;
uint8_t count = size;
uint8_t direction = -1;

const auto sync = [&size, &count, &mutex, &cv, &direction]()  //.
{
    {
        std::unique_lock<std::mutex> lock(mutex);
        auto current_direction = direction;
        if (--count == 0)
        {
            count = size;
            direction *= -1;
            cv.notify_all();
        }
        else
        {
            cv.wait(lock,
                    [&direction, &current_direction]()  //.
                    { return direction != current_direction; });
        }
    }
};

reusable barrier

的第一个未接受的答案中提供

'generation'必须存储在barrier对象内,以防止下一代为给定的线程集操纵当前代的唤醒'条件'。我不喜欢第一个未被接受的答案是不断增长的几代人的反击,我认为我们只需要区分两代,即如果一个线程满足等待条件并开始另一个屏障同步调用作为第二个不可接受的解决方案建议,第二个解决方案有点复杂,我相信上面的代码片段甚至足够(目前在main中本地实现但可以抽象为struct)。在我的“信念”中,我是否更正认为障碍最多只能同时使用2代?

0 个答案:

没有答案