c++ - 如何在这个小的多线程程序中调试死锁

标签 c++ multithreading pthreads

我是多线程的新手,因此从一个小程序开始。该程序的预期工作是,通过两个线程一个接一个地打印整数,这样一个线程应该打印一个数字,另一个线程应该打印下一个数字,这个过程应该继续直到定义的最大数字.

为此,我编写了一个小程序,但我面临死锁。我尝试使用 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/

相关文章:

objective-c - NSThread 拾取队列并处理它

c++ - pthread_mutex_lock __pthread_mutex_lock_full : Assertion failed with robust and 0x4000000

c - 设置缓冲区和调用 pthread_cond_signal 时是否需要设置互斥锁/解锁

c++ - 一个类中的pthread

c++ - 使用 cmake 构建的库的链接错误

c++ - 如何使用 C 编程从 dbus 传递/返回结构?

c++ - 将 Log4j CompositeTriggeringPolicy 功能与 log4CXX 结合使用

javascript - 使用php浏览时写入文件的完整路径

java - Java中捕获异常的并发排序任务执行器

java - 经典的读者-作者算法——使用单个锁有什么问题吗?