c++ - 为什么我的互斥量没有在我的其他线程锁定它之前锁定它?

标签 c++ c multithreading pthreads mutex

我正在运行 1 个使用 pthreads 创建的线程,并且我在该线程和我的主线程之间使用了一个互斥锁。据我了解,一旦线程准备好锁定互斥锁,它将自旋锁定直到能够锁定。但是我遇到了一个没有自旋锁的问题。我有的伪代码。

主线程:

//I create thread 1 on this line, then it enters the while loop
while(p.size() > r.size()){
  pthread_mutex_lock(&Mutex);
  //calculations and decrease p.size()
  pthread_mutex_unlock(&Mutex);
}

线程 1:

//wait 500ms before hitting mutex
pthread_mutex_lock(&Mutex);
//calculations
pthread_mutex_unlock(&Mutex);

我遇到的问题是 Thread 1 Mutex 永远不会锁定,直到主线程 while 循环退出。在主线程完成 while 循环之前,线程 1 到达互斥锁。

编辑:如果我在 while 循环结束时有 10 毫秒的延迟(互斥锁解锁后),那么这就解决了我的问题。但是如何在不增加 10 毫秒延迟的情况下解决问题。

最佳答案

您的主线程正在解锁互斥锁,然后立即再次锁定它。尝试在您的主循环中引入延迟(用于测试目的)以查看是否是问题所在。

查看此问题的答案: pthreads: thread starvation caused by quick re-locking

关于c++ - 为什么我的互斥量没有在我的其他线程锁定它之前锁定它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50247371/

相关文章:

c - 想要在 C 中创建动态字符串,但该程序没有对输入字符进行无限循环

c# - PInvoke 编码返回字符串数组 C#

c# - Web.UI 的 InvokeRequired 需要帮助

objective-c - Cocoa 输入事件对于 NSTimer 来说是线程安全的吗

c++ - 适用于头文件的函数别名

c++ - 如何为全局对象、对象数组以及类/结构中的对象调用构造函数?

c++ - 位扩展字节数组

c++ - Boost.Asio 文档不存在。这些错误是什么意思?

c++ - 如何通过 Qt Quick Test 测试 QAbstractListModel?

c# - 静态构造函数和单例类