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

Do condition variables provide priority for mutex locking?

本文关键字:优先级 变量 是否 条件      更新时间:2023-10-16

这是一个使用 thread C++ 类的实验。

初始条件(IC):

  1. 线程 A 有一个条件变量,该变量正在等待锁(在互斥锁上)。
  2. 线程 B 锁定了互斥锁。
  3. 线程 C 未执行任何操作。

现在线程 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上锁定优先级的问题,但我找不到任何解决这个特定问题的问题。

标准故意不指定允许自由实现。具体来说,C++11 §30.5.1 类 condition variable [thread.condition.condvar] 声明:

void notify_one() noexcept;

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

void notify_all() noexcept;

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

没有关于任何线程的偏好/公平性/优先级的声明,只需"取消阻止一个"或"取消阻止所有线程"。