我正在为我拥有的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()执行之后,没有任何代码。为什么是这样?
答案 0 :(得分:2)
&thread_id[1]
是一个指向单元素数组中 second 元素的指针。这将超出范围,并导致不确定的行为。
然后调用pthread_join
,将指针传递给数组中第一个和未初始化的元素。再次导致未定义的行为。
我建议您使用单个pthread_t
值(而不是数组),并在pthread_create
和{{1}中使用address-of运算符}通话:
pthread_join