如果有其他人在等待,是否有标准的STL或Qt方式来产生互斥锁,否则保留它?

时间:2018-02-15 18:53:58

标签: multithreading c++11 stl mutex q

在我的工作线程中,最方便的外部循环逻辑是

id: 1

主线程

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);

我使用C ++ 11和Qt 5.我应该如何实现它?

1 个答案:

答案 0 :(得分:0)

超级建议使用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()功能更昂贵。