相关疑难解决方法(0)

易失性与内存栅栏

下面的代码用于将工作分配给多个线程,唤醒它们,并等待它们完成。在这种情况下,“工作”包括“清理卷”。这个操作到底做什么与这个问题无关——它只是对上下文有帮助。该代码是庞大事务处理系统的一部分。

void bf_tree_cleaner::force_all()
{
    for (int i = 0; i < vol_m::MAX_VOLS; i++) {
        _requested_volumes[i] = true;
    }
    // fence here (seq_cst)

    wakeup_cleaners();

    while (true) {
        usleep(10000); // 10 ms

        bool remains = false;
        for (int vol = 0; vol < vol_m::MAX_VOLS; ++vol) {
            // fence here (seq_cst)
            if (_requested_volumes[vol]) {
                remains = true;
                break;
            }
        }
        if (!remains) {
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

布尔数组中的值_requested_volumes[i]表明线程是否i有工作要做。完成后,工作线程将其设置为 false 并返回睡眠状态。

我遇到的问题是编译器生成一个无限循环,其中变量remains始终为 true,即使数组中的所有值都已设置为 false。这只发生在-O3.

我尝试了两种解决方案来解决这个问题:

  1. 声明 …

c++ multithreading gcc volatile memory-fences

1
推荐指数
1
解决办法
1704
查看次数

标签 统计

c++ ×1

gcc ×1

memory-fences ×1

multithreading ×1

volatile ×1