条件变量是否为互斥锁定提供优先级?

时间:2014-02-12 17:14:27

标签: c++ c++11 locking mutex condition-variable

以下是使用thread C ++类的实验。

初始条件(IC):

  1. 线程A有一个等待锁定的条件变量(在互斥锁上)。
  2. 线程B锁定了互斥锁。
  3. 主题C没有做任何事情。
  4. 现在线程C调用m.lock()(创建锁时)。然后,线程B通知条件变量。线程A是否正在等待对该互斥锁进行锁定的条件变量的事实是否会使得它首先锁定互斥锁的可能性更大或更小,或者线程C是否可能这样做?

    这是我的意思的一个例子:

    #include <condition_variable>
    #include <mutex>
    #include <thread>
    
    std::condition_variable cv;
    std::mutex m;
    
    void funcB()
    {
        std::unique_lock<std::mutex> B_lk(m);
        sleep(2); // allow thread C to attempt lock; IC-2
        cv.notify_one();
        B_lk.unlock();
    }
    
    void funcC()
    {
        sleep(1); // allow thread B to lock; IC-3
        std::unique_lock<std::mutex> C_lk(m);
        /* Perform task C */
    }
    
    int main (int argc, char* argv[]) // thread A
    {
        std::unique_lock<std::mutex> A_lk(m);
        std::thread threadB(funcB);
        std::thread threadC(funcC);
        cv.wait(A_lk); // IC-1
    
        /* Perform task A */
    
        /* Clean up and return */
    }
    

    我认为线程A和C(在理论上,无论如何)同样可能在线程B解锁后锁定互斥锁,因为我没有在C ++标准中看到任何优先级。我在SO上阅读了关于锁定优先级的许多其他问题,但我找不到任何解决这个特定问题的问题。

1 个答案:

答案 0 :(得分:1)

标准中没有明确规定允许实施自由。具体来说,C ++11§30.5.1Classcondition variable [thread.condition.condvar]声明:

void notify_one() noexcept;
     

7 效果:如果有任何线程被阻塞等待*this,请取消阻止其中一个线程。

void notify_all() noexcept;
     

8 效果:取消阻止所有被阻止等待*this的线程。

没有关于任何主题的偏好/公平/优先权的声明,只是“解锁一个”或“全部解锁”。