不知怎的,我的代码正在返回分段错误。 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);
答案 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 terminate
和The 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);
。你应该使用这个属性变量创建线程。