2014-11-03 37 views
-1

我试图锁定两个互斥锁,以便每个线程(总共8个线程)的输出不会混淆。代码创建这8个线程并将策略设置为FIFO。它有点作品,但不是所有的线程输出。下面的代码是唯一的功能,包括整个代码中的任何类型的互斥体。互斥锁不工作,就像我不想在Linux Bourne shell中工作

代码:

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的一个输出样本:如果我用printf代替cout

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

Thread 1 Looped: 1185961319 
+0

“globalstop”何时/如何变为“false”?互斥体在哪里/如何初始化? – 2014-11-03 20:59:12

+0

globalstop与问题无关。当按下“Enter”时,globalstop会变为true,每个线程旋转并计数,然后当输入被按下时,可以输出每个线程的旋转计数。 @ScottHunter – MattiasLarsson 2014-11-03 21:02:35

+0

和互斥量初始化? – 2014-11-03 21:06:03

回答

0

您发布的代码工作正常,我;这解释了为什么会出现这种情况:Is cout synchronized/thread-safe?

您可以通过让全局计数器与每个互斥量相关联来确认您的线程是否到达正确的部分(并且问题与打印有关),并在每个关键部分增加关联的计数器,并打印它们的最终部分一旦所有的线程都退出了,这个值就会变成

+0

我改为printf,但我仍然得到相同的结果。我添加了全局计数器来检查所有线程是否进入互斥锁,并且大多数情况下,它们不会在第一个互斥体中获得4个,在第二个互斥体中获得1个。所以,这个问题会变成这样:为什么不是所有的线索都被创造/去他们应该去的地方? @ScottHuter – MattiasLarsson 2014-11-04 18:11:49

+0

我想你应该看看他们是如何创建的;奇怪的是,1进入第二个*没有进入第一个。 – 2014-11-04 19:01:57

+0

我解决了他的第一部分,那就是当它只创建打印出4个线程进入第一部分。我添加了一个变量两次,以便输出在一段时间后进行处理。但第二个输出probem仍然存在,1线程出现8个线程... @ScottHunter – MattiasLarsson 2014-11-05 09:10:53