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)
我对吗?
不,你错了。
我认为因为当代码到达 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总是在其他地方被访问,并持有相同的锁。这是您的问题所推测的,但只是正式指出。
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |