pthread_join给出分段错误

时间:2014-11-20 06:06:31

标签: c

不知怎的,我的代码正在返回分段错误。 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;

listen_connection声明:

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);

2 个答案:

答案 0 :(得分:0)

*(int *)sockfd错了。 sockfd不是指针,因为您将int传递给pthread_create()。要么&sockfd传递给pthread_create(),要么像(int) sockfd一样投射。

答案 1 :(得分:0)

分段错误不太可能由pthread_join引起。 MAN页面http://linux.die.net/man/3/pthread_join The pthread_join() function waits for the thread specified by thread to terminateThe thread specified by thread must be joinable.

我认为你应该检查pthread_join(tid[0], NULL);语句的返回值,以确保它按预期工作。它应该给出错误号,因为您的线程tid[4]不可连接。您应该创建pthread属性变量pthread_attr_t attr;,然后初始化该attr变量pthread_attr_init(&attr);,最后使用pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);。你应该使用这个属性变量创建线程。