我的代码以某种方式返回分段错误。 sockfd是一个int或文件描述符
pthread_t tid[4];
int err;
int k = 0;
while (k < 4) {
err = pthread_create(&tid[k], NULL, listen_connection, (void*) sockfd);
k++;
}
pthread_join(tid[0], NULL); // causes segmentation fault
pthread_join(tid[1], NULL);
pthread_join(tid[2], NULL);
pthread_join(tid[3], NULL);
return 0;
监听连接的声明:
void * listen_connection(void *);
实际功能:
void * listen_connection(void *sockfd) {
int newsockfd, n;
// client address
struct sockaddr_in cli_addr;
socklen_t clilen;
newsockfd = accept(*(int*)sockfd, (struct sockaddr *) &cli_addr, &clilen);
...
编辑:我想通了。
代替:
err = pthread_create(&tid[k], NULL, listen_connection, (void*) sockfd);
我将其更改为:
err = pthread_create(&tid[k], NULL, listen_connection, (void*) &sockfd);
最佳答案
*(int *)sockfd
是错误的。 sockfd
不是指针,因为您将int传递给了pthread_create()。可以将&sockfd
传递给pthread_create(),也可以像这样(int) sockfd
进行强制转换。
关于c - pthread_join给出段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27032865/