下面的代码用于将工作分配给多个线程,唤醒它们,并等待它们完成。在这种情况下,“工作”包括“清理卷”。这个操作到底做什么与这个问题无关——它只是对上下文有帮助。该代码是庞大事务处理系统的一部分。
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.
我尝试了两种解决方案来解决这个问题: