我试图锁定两个互斥锁,以便每个线程的输出(总共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
答案 0 :(得分:0)
您发布的代码适用于我如果我使用printf
代替cout
;这解释了为什么会出现这种情况:Is cout synchronized/thread-safe?。
您可以通过使用与每个互斥锁关联的全局计数器来验证您的线程是否到达正确的部分(并且问题仅在于打印),并在每个关键部分中递增关联的计数器,并打印其最终值一旦所有线程都退出了。