代码之家  ›  专栏  ›  技术社区  ›  spraff

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

  •  0
  • spraff  · 技术社区  · 6 年前

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

    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。我应该如何实现这一点?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Jeremy Friesner    6 年前

    super建议使用std::atomic\u int<&燃气轮机;可能有用,但我认为您可能想得太多了——一种更简单、更容易验证工作线程的方法是:

    while(not done)
    {
       lock_mutex();
       do_some_work();
       unlock_mutex();
    }
    

    这将允许其他线程在当前调用do\u some\u work()返回后立即获得互斥体的所有权。

    如果您担心会引入额外的锁止和解锁互斥体,请不要担心--互斥体现在已经得到了很好的优化,而且它们的lock\u mutex()和unlock\u mutex()操作不太可能比check\u If\u someone\u is\u waiting()功能更昂贵。