为什么 pthread_join() 之后的代码没有执行?

why isnt the code after pthread_join() executed?

我正在为我拥有的 IRC 服务器编写一个简单的 tcp 客户端。因此,我通过编写器线程和接收器线程来实现这一点,但是在用户退出会话后,程序会在线程停止后停止所有执行,并仅在控制台中显示类似 scanf() 的输出。

void senderThread(void* context){
  for(;;){
    //setup here
    //gets user input and stores into char* msg
    if(strcmp(msg, "quit") == 0){
      printf("quitting...\n");
      free(msg);
      shutdown(clientdata->sockfd, SHUT_RDWR);
      return NULL;
    }else {
      write(clientdata->sockfd, msg, strlen(msg));
      write(clientdata->sockfd, "\n", strlen("\n"));
      free(msg);
    }

  }
  return NULL;
}




int main(int argc, char* argv[]){                                                                        
  //setup stuff here    
  pthread_t thread_id[1];                     
  pthread_create(&thread_id[1], NULL, senderThread, (void *) &clientdata);      
  printf("creating threads...\n");        
  pthread_join(thread_id, NULL); //for(;;) loop here    
  shutdown(sockfd, SHUT_RDWR);                    
  free(username);                                                                                        
  return 0;                                                                                              
}   

这是程序代码的一部分,但是当我在标准输入中键入 'quit' 时,没有任何反应。 printf 和关闭都启动了,但随后我只剩下等待输入的终端和程序实际上没有关闭。 none 执行 pthread_join() 之后的代码。为什么是这样?

&thread_id[1] 是指向单元素数组中第 second 元素的指针。这将超出范围并导致 未定义的行为

然后调用 pthread_join 将指针传递给数组中第一个 且未初始化的 元素。再次导致 未定义的行为

我建议您使用单个 pthread_t value(而不是数组),并在 pthread_createpthread_join 呼叫:

pthread_t thread_id;                     
pthread_create(&thread_id, ...);
pthread_join(&thread_id, NULL);