C++ wait_for 方法互斥体中谓词的内容是否受保护?

Sam*_*ami 7 c++ multithreading mutex predicate

假设countMe是一个全局变量,并且我同时向这个 while 循环启动 10 个线程,变量countMe互斥体是否在谓词中受保护?我认为因为当代码到达 wait_for 时它会解锁并释放锁,因此变量 countMe 不受互斥保护。我对吗?

while (true)
{
    std::unique_lock<std::mutex> lock(mtx_kill);
    cv_kill.wait_for(lock, 500ms, [&]() {++countMe; return killFlag; });

    if (killFlag)
    {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 5

我对吗?

不,你错了。

我认为因为当代码到达 wait_for 时它会解锁锁,因此变量 countMe 不受互斥保护。

不,当计算 lambda 时,互斥体处于锁定状态。有保证。

cppreference.com描述了in terms of的谓词版本wait_forwait_until,描述如下:

while (!stop_waiting()) {
    if (wait_until(lock, timeout_time) == std::cv_status::timeout) {
        return stop_waiting();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,互斥锁的初始状态是锁定的。当互斥量处于锁定状态时,始终会调用此处称为“stop_waiting”的谓词。

您可以将其视为wait_for无谓词wait,并将附加谓词检查视为离散的单独步骤。返回后,wait互斥锁被重新锁定,这发生在谓词(即您的 lambda)执行之前。如果它投反对票,互斥体将再次以原子方式解锁,同时条件变量再次等待。

PS 上面的讨论假设您countMe总是在其他地方被访问,并持有相同的锁。这是您的问题所推测的,但只是正式指出。