我是多线程的新手,因此从一个小程序开始。该程序的预期工作是,通过两个线程一个接一个地打印整数,这样一个线程应该打印一个数字,另一个线程应该打印下一个数字,这个过程应该继续直到定义的最大数字.
为此,我编写了一个小程序,但我面临死锁。我尝试使用 gdb 查找互斥体所有者,但它在我执行 print mutex 命令时只打印 $3 = 2。
这是源代码:
#include <iostream>
#include <fstream>
#include <pthread.h>
#include <signal.h>
const int MAX_NUM = 13;
pthread_cond_t cond[1] = {PTHREAD_COND_INITIALIZER,};
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int Count = 0;
using namespace std;
void* thread1(void*)
{
do {
cout<<"inside thread 1 abt to acquire lock"<<endl;
// Increment counter in thread1
pthread_mutex_lock(&mutex);
cout<<"inside thread 1 blocked"<<endl;
pthread_cond_wait(&cond[0],&mutex);
cout<<"after pthread_cond_wait in thread1"<<endl;
pthread_cond_signal(&cond[1]);
if(Count < MAX_NUM)
{
Count++;
pthread_mutex_unlock(&mutex);
cout<<"Printing from thread 1"<<endl;
cout<<Count<<endl;
}
else
{
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
}while(1);
}
void* thread2(void*)
{
do{
cout<<"inside thread 2 abt to acquire lock"<<endl;
pthread_mutex_lock(&mutex);
cout<<"inside thread 2 blocked"<<endl;
pthread_cond_wait(&cond[1],&mutex);
// Increment counter in thread2
pthread_cond_signal(&cond[0]);
if(Count < MAX_NUM)
{
Count++;
pthread_mutex_unlock(&mutex);
cout<<"Printing from thread 2"<<endl;
cout<<Count<<endl;
}
else
{
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
}while(1);
}
int main()
{
pthread_t t[2];
void* (*fun[2])(void*);
fun[0]=thread1;
fun[1]=thread2;
for (int i =0 ; i < 2; ++i)
{
pthread_create(&t[i],NULL,fun[i],NULL);
}
cout<<"threads created"<<endl;
pthread_cond_signal(&cond[0]);
cout<<"In main after sending signal"<<endl;
pthread_join(t[0],NULL);
pthread_join(t[1],NULL);
pthread_exit(NULL);
}
输出是:
在线程 1 内 abt 获取锁
内部线程 1 阻塞
在线程 2 内 abt 获取锁
内部线程 2 阻塞
线程创建
发送信号后在main
我希望 main() 线程向执行其工作(即更新计数器)的线程 1 发送信号,然后将信号传递给执行其工作(即更新计数器)的线程 2,并将信号传递给线程 1。此过程应该继续,直到达到最大数量。如果达到最大数量,每个进程都会解锁互斥量并正常退出。
请帮帮我。我真的试了很多都没有用。
最佳答案
线
pthread_cond_t cond[1] = {PTHREAD_COND_INITIALIZER,};
定义了一个大小为 1 的数组,但稍后您使用 cond[1]
,这是数组中的第二个条目,它是未定义的。你是说
pthread_cond_t cond[2] = {PTHREAD_COND_INITIALIZER,PTHREAD_COND_INITIALIZER};
这看起来像是一个不幸的错字。 (由于前面的MAX_NUM = 13
?)
关于c++ - 如何在这个小的多线程程序中调试死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17756428/