我正在尝试通过创建线程来实现多线程UDP服务器。
以下方法用于创建线程。
pthread_create(&threadID, NULL, ThreadMain, threadArgs);
ThreadMain方法是,
void *ThreadMain(void *threadArgs) {
pthread_detach(pthread_self());
int sock = ((struct ThreadArgs *) threadArgs)->sock;
free(threadArgs);
HandleUDPClient(sock);
return (NULL);
}
在HandleUDPClient方法中是这样的,
void HandleUDPClient(int sock) {
struct sockaddr_storage clntAddr; // Client address
// Set Length of client address structure (in-out parameter)
socklen_t clntAddrLen = sizeof(clntAddr);
// Block until receive message from a client
char buffer[MAXSTRINGLENGTH]; // I/O buffer
// Size of received message
ssize_t numBytesRcvd = recvfrom(sock, buffer, MAXSTRINGLENGTH, 0, (struct sockaddr *) &clntAddr, &clntAddrLen);
...
...
当我创建套接字并运行HandleUDPClient方法时,它会完美地处理来自客户端的请求。但是当我尝试使用线程时,在进入HandleUDPClient方法后,它不会处理recvfrom方法。实际上它并不等待客户端接收任何请求。程序刚终止。
有人能告诉我为什么会出现这个问题,我该如何解决?
答案 0 :(得分:2)
问题在于您分离了线程,这意味着您不必等待线程退出。相反,主程序继续工作,直到它到达终点然后退出,而不考虑仍在运行的(分离的)线程。
要么不要分离线程,要使用pthread_join
加入"加入"线程,或者使用主线程中的pthread_exit
来确保它等待所有分离的线程完成。