为什么 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_create
和pthread_join
呼叫:
pthread_t thread_id;
pthread_create(&thread_id, ...);
pthread_join(&thread_id, NULL);
我正在为我拥有的 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_create
和pthread_join
呼叫:
pthread_t thread_id;
pthread_create(&thread_id, ...);
pthread_join(&thread_id, NULL);