【问题标题】:Mutex lock is not working like I want it to in Linux互斥锁在 Linux 中没有像我希望的那样工作
【发布时间】:2014-12-30 14:54:55
【问题描述】:

我正在尝试锁定两个互斥锁,以便每个线程(总共 8 个线程)的输出不会混淆。代码的主要部分创建这 8 个线程并将策略设置为 FIFO。它有点工作,但不是所有的线程输出。下面的代码是整个代码中唯一包含任何类型的任何互斥锁的函数。

代码是:

void* print_message_function2( void* x )
{   

ostringstream convert;

long int num = (long int) x;
long int counter = 0;

pthread_mutex_lock(&mutex1);
string ThreadId;
convert << num;
ThreadId = convert.str();

cout << "Thread " << ThreadId << " is started";
cout << endl;
pthread_mutex_unlock(&mutex1);
while(globalstop == false)
{
counter++;
}
pthread_mutex_lock(&mutex2);
string LoopCounter;
convert << counter;
LoopCounter = convert.str();

cout << "Thread "<< ThreadId <<" Looped: " << LoopCounter;
cout << endl;
pthread_mutex_unlock(&mutex2);
pthread_exit (NULL);
}

也是来自 bourne shell 的示例输出:

Thread 1 is started
Thread 5 is started
Thread 3 is started
Thread 7 is started

Thread 1 Looped: 1185961319

【问题讨论】:

  • globalstop 何时/如何变为非false?互斥锁在哪里/如何初始化?
  • globalstop 与问题无关。当按下“Enter”时 globalstop 变为真,每个线程旋转并向上计数,然后当按下 enter 时,它应该输出每个线程 spin-count 。 @ScottHunter
  • 还有互斥体初始化?
  • 互斥量初始化:pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;@ScottHunter

标签: c++ linux multithreading unix mutex


【解决方案1】:

你发布的代码对我来说很好如果我使用printf而不是cout;这解释了为什么会出现这种情况:Is cout synchronized/thread-safe?

您可以通过与每个互斥锁关联一个全局计数器来验证您的线程是否到达了正确的部分(问题仅在于打印),并在每个关键部分增加关联的计数器,并打印它们的最终值一旦所有线程都退出了。

【讨论】:

  • 我改成 printf 我仍然得到相同的结果。我添加了全局计数器来检查是否所有线程都进入了互斥锁,并且在大多数情况下,它们不会在第一个互斥锁中获得 4 个,在第二个互斥锁中获得 1 个。那么问题就来了:为什么不是所有线程都被创建/去他们应该去的地方? @ScottHuter
  • 我想你需要看看它们是如何创建的;奇怪的是 1 进入第二个没有进入第一个。
  • 我解决了他的第一部分,即当它只创建打印出 4 个线程进入第一部分时。我两次添加了一个变量,以便在一段时间后对输出进行操作。但是第二个输出探针仍然存在,8个线程进入1出来...... @ScottHunter
  • 没有看到任何代码,你就靠自己了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2021-10-06
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
相关资源
最近更新 更多