pthread_create() 后的分段错误
Segmentation Fault after pthread_create()
用这个创建一个线程:
pthread_t thread;
pthread_create(&thread, NULL, (void*)&serve_connection, (void*)sockfd);
我调用的函数定义为:
void serve_connection (void* sockfd) {
ssize_t n, result;
char line[MAXLINE];
connection_t conn;
connection_init (&conn);
conn.sockfd = *((int*)sockfd);
while (! shutting_down) {
...
...
}}
函数的其余部分在“...”中,但它无关紧要,因为我已将段错误跟踪到
conn.sockfd = *((int*)sockfd);
其中 conn.sockfd 的类型为 'int'。
最初 serve_connection 是:
void serve_connection (int sockfd){
...
conn.sockfd = sockfd;
...
}
但我是从线程调用它的,因此必须进行更改。我还应该注意,传递给 pthread_create 的 sockfd 是一个具有值的 int。
我在编译时也收到了这些警告:
warning: ISO C forbids conversion of function pointer to object pointer type
warning: cast to pointer from integer of different size
warning: ISO C forbids passing argument 3 of âpthread_createâ between function pointer and âvoid *â
note: expected âvoid * (*)(void *)â but argument is of type âvoid *â
这些都是指我调用pthread_create的那一行。直到现在我都忽略了警告,因为程序运行到上面指定的行,所以我假设函数被正确调用。我只是无法弄清楚是什么导致了分段错误,因为我对使用 pthreads 还是陌生的(我假设我正在调用或声明错误,但查看库并没有真正帮助)。
我认为你应该按如下方式更改分配:
conn.sockfd = (int)sockfd;
对于你的情况,考虑更换
conn.sockfd = *((int*)sockfd);
来自
conn.sockfd = (int)sockfd;
You didn't have passed the sockfd variable as a pointer so you cannot dereference it. Take a look at : http://en.wikipedia.org/wiki/Dereference_operator
用这个创建一个线程:
pthread_t thread;
pthread_create(&thread, NULL, (void*)&serve_connection, (void*)sockfd);
我调用的函数定义为:
void serve_connection (void* sockfd) {
ssize_t n, result;
char line[MAXLINE];
connection_t conn;
connection_init (&conn);
conn.sockfd = *((int*)sockfd);
while (! shutting_down) {
...
...
}}
函数的其余部分在“...”中,但它无关紧要,因为我已将段错误跟踪到
conn.sockfd = *((int*)sockfd);
其中 conn.sockfd 的类型为 'int'。
最初 serve_connection 是:
void serve_connection (int sockfd){
...
conn.sockfd = sockfd;
...
}
但我是从线程调用它的,因此必须进行更改。我还应该注意,传递给 pthread_create 的 sockfd 是一个具有值的 int。
我在编译时也收到了这些警告:
warning: ISO C forbids conversion of function pointer to object pointer type
warning: cast to pointer from integer of different size
warning: ISO C forbids passing argument 3 of âpthread_createâ between function pointer and âvoid *â
note: expected âvoid * (*)(void *)â but argument is of type âvoid *â
这些都是指我调用pthread_create的那一行。直到现在我都忽略了警告,因为程序运行到上面指定的行,所以我假设函数被正确调用。我只是无法弄清楚是什么导致了分段错误,因为我对使用 pthreads 还是陌生的(我假设我正在调用或声明错误,但查看库并没有真正帮助)。
我认为你应该按如下方式更改分配:
conn.sockfd = (int)sockfd;
对于你的情况,考虑更换
conn.sockfd = *((int*)sockfd);
来自
conn.sockfd = (int)sockfd;
You didn't have passed the sockfd variable as a pointer so you cannot dereference it. Take a look at : http://en.wikipedia.org/wiki/Dereference_operator