在我的工作线程中,最方便的外循环逻辑是
lock (mutex_foo);
while (not done)
{
do_some_work ();
if (someone_is_waiting_for (mutex_foo))
{
unlock (mutex_foo);
wait_until_someone_else_locks (mutex_foo);
// expect this lock to already be taken,
// this thread will now wait its turn
lock (mutex_foo);
}
}
unlock (mutex_foo);
主线程会
while (not_done)
{
do_stuff ();
lock (mutex_foo); // this will interrupt the worker thread's main loop
use_shared_resource ();
unlock (mutex_foo);
}
我使用 C++11 和 Qt 5。我应该如何实现它?
最佳答案
super 关于使用 std::atomic_int<> 的建议可能会奏效,但我认为您在这里可能想得太多了——一种更简单、更易于验证的工作线程方法是这样的:
while(not done)
{
lock_mutex();
do_some_work();
unlock_mutex();
}
这将允许其他线程在当前对 do_some_work() 的调用返回后立即获得互斥体的所有权。
如果您担心这会引入额外的互斥锁锁定和解锁,请不要担心——互斥锁现在已经得到了很好的优化,它们的 lock_mutex() 和 unlock_mutex() 操作不太可能再出现了比你的 check_if_someone_is_waiting() 功能要贵。
关于c++ - 如果其他人正在等待,是否有标准的 STL 或 Qt 方法来产生互斥量,否则保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48814370/