c - 这个死锁隐藏在哪里?

标签 c multithreading pthreads deadlock

我实际上是在编写一个 MPI 程序。这是一个基本的客户端/服务器模式。服务器有一组工作要计算。客户得到这个大集合的子集。每个客户端使用多个线程来计算子集。在向服务器请求另一个子集之前,我必须确保所有线程都已完成。

客户端被分成几个线程:一个主线程(用于通信)和几个工作线程。

这是我的实际代码,应该发生死锁的地方。我清除了所有 MPI 调用,以使其更具可读性。我真的看不出我在这里做错了什么。

void* worker ( void * arg ) {
  while (work != 0) {
    int x;
    while ( get_job(&x) ) {
      do_job(x);
    }
    pthread_mutex_lock(&mutex_worker);
    nb_job_empty++;
    if (nb_job_empty == NB_THREADS) {
      nb_job_empty = 0;
      pthread_cond_signal(&cond_master);
    }
    nb_worker_woken--;
    pthread_cond_wait(&cond_worker, &mutex_worker);
    nb_worker_woken++;
    pthread_mutex_unlock(&mutex_worker);
  }
    return ( void * ) 0 ;
}

void server() {
    for (int i = 0; i < 100; i++) {
      add_job();
      pthread_mutex_lock(&mutex_master);
      pthread_cond_broadcast(&cond_worker);
      pthread_cond_wait(&cond_master, &mutex_master);
      pthread_mutex_unlock(&mutex_master);
    }
    work = 0;
    pthread_mutex_lock(&mutex_master);
    pthread_cond_broadcast(&cond_worker);
    pthread_mutex_unlock(&mutex_master);
}

最佳答案

您应该为两种情况使用相同的互斥锁(mutex_master 和 mutex_worker 应该相同)

此外,您应该按照建议在 while 循环中使用 pthread_cond_wait :)

关于c - 这个死锁隐藏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/536432/

相关文章:

c - 在 Ubuntu 上编译 C 时没有输入文件或 undefined reference

c++ - pthread_join 的段错误

c - 尝试从文本文件中读取单词并添加到链接列表,程序崩溃,我不知道为什么

c++ - 我的程序在 Windows 机器上崩溃但在 Linux 上运行正常

C# MVC 4 多线程和 Web 请求

java 生产者-消费者优化

c - c 多线程编程中的 pthread_create 参数

c - 对于结构变量s1,s2,为什么我可以初始化 "s1={25,3.5}",将s2赋值为 "s1=s2",然后就不能使用“s1={59,3.14}?

c - 了解 Unix dup2 系统调用?

python - 将 MKL 优化的 numpy.dot() 与 3d 数组结合使用