我认为pthread_join应该始终返回一个值,然后允许主线程在此之后处理代码。根据我过去的经验,这将有效。但现在我坚持了下来。不知何故,它只是不返回并阻止主线程。或者它可能是执行任务的主线程。我不知道为什么。在下面的代码中,在终止客户端之前,我无法访问“Thread created2”。有什么想法吗?
int main(int argc, char *argv[]) {
int sockfd, port; /* listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
socklen_t sin_size;
if(signal(SIGINT, sigintEvent) == SIG_ERR)
printf("can't catch SIGINT!");
/* generate the socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (argc > 1) {
port = atoi(argv[1]);
} else {
port = MYPORT;
}
/* generate the end point */
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(port); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
/* bzero(&(my_addr.sin_zero), 8); ZJL*/ /* zero the rest of the struct */
/* bind the socket to the end point */
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
== -1) {
perror("bind");
exit(1);
}
/* start listnening */
if (listen(sockfd, MAXCONNECTIONS) == -1) {
perror("listen");
exit(1);
}
createPool(MAXCONNECTIONS);
/* create a node pointer as head of the list */
head = (node*)malloc(sizeof(node));
openFile();
printf("server starts listnening ...\n");
int new_fd;
sin_size = sizeof(struct sockaddr_in);
while((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size))) {
printf("Accepted!\n");
printf("server: got connection!\n");
//tNode* tThread = (tNode*)threadDequeue();
pthread_t pt;
printf("Got tThread.\n");
if((pthread_create(&pt, NULL, runService,(void*)&new_fd)) != 0) {
printf("error creating thread.");
abort();
}
printf("Thread created.\n");
if( pthread_join(pt, NULL) != 0 ) {
printf("error joining thread");
abort();
}
printf("Thread created2.\n");
}
exit(1);
}
答案 0 :(得分:4)
从文档中我们可以阅读有关pthread_join
的以下信息pthread_join()函数等待指定的线程 线 终止。如果该线程已经终止,那么 pthread_join()立即返回。线程指定的线程 必须可以加入。
这表明在您的情况下,父线程正在等待其子线程 pt 的完成。执行runService
的子线程 pt 仍未返回/完成。因此,您的父线程将继续等待完成(不从pthread_join方法返回)。
您应该尝试查看runService
的代码以了解这种情况。