我的代码以某种方式返回分段错误。 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/

10-13 08:45