c - pthread_join 阻止我的代码

标签 c multithreading pthreads

你能解释一下为什么下面的 pthread_join 不起作用吗?它会阻塞我的代码。 如果我评论这三行,我的代码会执行预期的操作,但显然我不知道线程是否终止(在我的代码中没有问题,但在更大的情况下有问题)。

int k=0;
pthread_mutex_t mutex= PTHREAD_MUTEX_INITIALIZER;

struct primi{
   int s;
   int temp;
};
struct example{
   int c;
   struct primi primissimi;
};
void *funzione_thread(void* args);

void prepare(void){
   printf("preparing locks...\n");
   pthread_mutex_lock(&mutex);   }
void parent(void){
   printf("parent unlocking locks...\n");
   pthread_mutex_unlock(&mutex);}
void child(void){
   printf("child unlocking locks...\n");
   pthread_mutex_unlock(&mutex);  }
void *thr_fn(void *arg){
   printf("thread started...\n");
   return(0);}


void *funzione_thread(void* args){
   pthread_mutex_lock(&mutex);
   struct example *exthread = args;
   struct example locale = *exthread;
   locale.primissimi.s++;pthread_mutex_unlock(&mutex);
   printf("local is %d original is %d\n",locale.primissimi.s,exthread->primissimi.s);
   exthread->primissimi.s = locale.primissimi.s;
   printf("after it is%d\n",exthread->primissimi.s);
   pthread_exit(NULL);
}


int ffork(struct example *extmp){
  pthread_t id[5];
  int i;
  while(k<3){
    k++;
    pthread_create(&id[k],NULL,funzione_thread,extmp);
    }
  printf("now k is %d\n\n",k);
  for(i=1;i<=3;i++){
    pthread_join( id[i] ,NULL );
    printf("waited thread %d\n",i);
    }
  printf("threads completed\n");
  pthread_exit (NULL);  
  //return 1;
}
 int main(int argc, char** argv){

  struct example *ex = malloc(sizeof(*ex));
  int pid,tmp;
      pthread_t tid;

      if ((err = pthread_atfork(prepare, parent, child)) != 0){
           printf("can't install fork handlers");
           exit(-1);}
      pthread_create(&tid, NULL, thr_fn, 0);
      sleep(1);
      pid=fork();
      if(pid==0){
         ex->c=1;
         ex->primissimi.s=1;
         if((tmp=ffork(ex))!=1){
        printf("errore in ffork\n");
        sleep(2);
        exit(0);
        }
    else{printf("tutto ok in ffork\n");
        sleep(2);
        exit(0);
        }
    }//fine figlio

else{
    sleep(10);
}
return 0;
 }

最佳答案

您的代码无法防止在锁定互斥体的情况下调用fork。由于锁定互斥锁的线程不存在于子级中,因此它永远无法解锁互斥锁。子进程中任何尝试获取互斥锁的线程都会死锁,等待不存在的线程释放锁。

有很多可能的修复方法,但最简单的可能是在调用 fork 时保持互斥锁。您可以使用atfork处理程序来执行此操作。安排处理程序在 fork 之前获取互斥体,并在之后释放它(在父级和子级中)。

您确实需要知道将 fork 与 pthread 一起使用时要做什么,除非您要立即在子进程中exec

关于c - pthread_join 阻止我的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9056735/

相关文章:

c++ - “pthread_setname_np”未在此范围内声明

c - C 中的多线程目录工作

c - 使用 C 中的结构将数据传递给 Pthread

ios - 奇怪的 atoi(char *) 问题

c - 快速搜索双向链表

c++ - 在多线程中初始化 vector

java - 并发:缓存一致性问题还是编译器优化?

c# - 线程池、执行顺序和长时间运行的操作

c - 在 C 中读取和转换枚举类型

C: char 指针 & 段错误