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

时间:2019-12-17 08:48:05

标签: c pthreads

我正在为我拥有的IRC服务器编写一个简单的tcp客户端。因此,Im通过拥有编写器线程和接收器线程来实现此目的,但是在用户退出会话之后,程序在线程停止后停止所有执行,并在控制台中仅显示类似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和shutdown均会触发,但随后我留在了等待输入的终端,程序实际上并未关闭。 pthread_join()执行之后,没有任何代码。为什么是这样?

1 个答案:

答案 0 :(得分:2)

&thread_id[1]是一个指向单元素数组中 second 元素的指针。这将超出范围,并导致不确定的行为

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

我建议您使用单个pthread_t (而不是数组),并在pthread_create和{{1}中使用address-of运算符}通话:

pthread_join