条件变量是否为互斥锁提供优先级
Do condition variables provide priority for mutex locking?
这是一个使用 thread
C++ 类的实验。
初始条件(IC):
- 线程 A 有一个条件变量,该变量正在等待锁(在互斥锁上)。
- 线程 B 锁定了互斥锁。
- 线程 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
的线程。
没有关于任何线程的偏好/公平性/优先级的声明,只需"取消阻止一个"或"取消阻止所有线程"。
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 将数组的地址分配给变量并删除
- 为"adjacent"变量赋值时出现问题
- enum是C++中的宏变量还是整数变量
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 用C++中的一个变量定义一个常量
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 你能重载对象变量名本身返回的内容吗
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 尝试通过多个向量访问变量时,向量下标超出范围
- 试图让变量检查数组中的某些内容
- Cpp-Tuple使用带有变量的get
- 将包含C样式数组的对象初始化为成员变量(C++)
- 当vector是tje全局变量时,c++中vector的内存管理
- 通过多个头文件使用常量变量
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 条件变量是否为互斥锁提供优先级
- 尝试使用自定义类的结构中的变量创建该类的优先级队列