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

C 为什么pthread_join()之后的代码没有执行?,c,pthreads,C,Pthreads,我正在为我拥有的IRC服务器编写一个简单的tcp客户端。因此,我通过一个writer线程和一个receiver线程来实现这一点,但是在用户退出会话后,程序会在线程停止后停止所有执行,并在控制台中显示类似scanf()的输出 void senderThread(void* context){ for(;;){ //setup here //gets user input and stores into char* msg if(strcmp(msg, "quit") =

我正在为我拥有的IRC服务器编写一个简单的tcp客户端。因此,我通过一个writer线程和一个receiver线程来实现这一点,但是在用户退出会话后,程序会在线程停止后停止所有执行,并在控制台中显示类似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;                                                                                              
}   


这是程序代码的一部分,但是当我在stdin中键入'quit'时,什么也没有发生。printf和shutdown都会启动,但我只剩下了等待输入的终端和没有实际关闭的程序。执行pthread_join()后没有任何代码。为什么会这样

&thread\u id[1]
是指向单元素数组中第二个元素的指针。这将超出范围,并导致未定义的行为

然后调用
pthread\u join
传递指向数组中第一个未初始化元素的指针。再次导致未定义的行为

我建议您使用单个
pthread\u t
值(而不是数组),并在
pthread\u create
pthread\u join
调用中使用运算符的地址:

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

&thread\u id[1]
是指向单元素数组中第二个元素的指针。这将超出范围,并导致未定义的行为

然后调用
pthread\u join
传递指向数组中第一个未初始化元素的指针。再次导致未定义的行为

我建议您使用单个
pthread\u t
值(而不是数组),并在
pthread\u create
pthread\u join
调用中使用运算符的地址:

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

始终使用
-Wall
编译并消除从gcc获得的警告墙。始终使用
-Wall
编译并消除从gcc获得的警告墙。