C 为什么我的简单pthreads程序会因为分段错误而崩溃?
在上面的程序中,我得到了一个分段错误。我需要的输出是在按下C 为什么我的简单pthreads程序会因为分段错误而崩溃?,c,linux,pthreads,C,Linux,Pthreads,在上面的程序中,我得到了一个分段错误。我需要的输出是在按下's'后继续打印“发送线程”。我已经研究了以前类似的问题,但我找不到答案。有人能帮我吗?这是电话线吗: nivas@balakrishnan-HCL-Desktop:~/C_sample$ gcc -pthread -o thread thread.c nivas@balakrishnan-HCL-Desktop:~/C_sample$ ./thread Choose your terminal S or R Send Th
's'
后继续打印“发送线程”
。我已经研究了以前类似的问题,但我找不到答案。有人能帮我吗?这是电话线吗:
nivas@balakrishnan-HCL-Desktop:~/C_sample$ gcc -pthread -o thread thread.c
nivas@balakrishnan-HCL-Desktop:~/C_sample$ ./thread
Choose your terminal S or R
Send Thread
Send Thread
Send Thread
Send Thread
Send Thread
Segmentation fault (core dumped)
nivas@balakrishnan-HCL-Desktop:~/C_sample$ ^C
nivas@balakrishnan-HCL-Desktop:~/C_sample$
打字错误?pthread\u create
的第三个参数是函数指针,线程应该从这里开始
应改为:
if(pthread_create(&send,NULL,send_function(),NULL))
此外,创建的线程不会真正退出,除非您将其属性位设置为已分离,或显式分离它们,或使用
pthread\u join
收集状态。您需要更改函数send\u function()
,此函数应将指向void
的指针作为参数,并应返回指向void的指针:
if(pthread_create(&send,NULL,send_function,NULL))
您还需要更正函数调用,其中包括一对括号:
void * send_function(void *parg)
{
printf("\n Send Thread \n");
return parg;
}
实际上,程序将循环打印“发送线程”
,直到系统资源耗尽。通过在main()
中的循环之前添加这些行,可以创建分离的线程,这些线程在终止时释放系统资源:
然后将循环内的pthread\u create()
调用更改为:
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0) {
perror("Error in pthread_attr_init()");
exit(EXIT_FAILURE);
}
if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) {
perror("Error in pthread_attr_setdetachstate()");
exit(EXIT_FAILURE);
}
更改后,您的程序应重复打印
“发送线程”
,在打印每条消息后释放资源,直到您停止它。此外,发送函数()
声明返回无效*
,但不返回任何内容。这是正确的@david。现在它工作正常。没有分段问题。在代码中进行更改后。在我按“s”键后,它在整个程序中不会无限工作。它在几个周期后停止。我不知道为什么会出现这种情况。@NivasB--您可能想在这里创建分离的线程。我在回答中补充了一点。鞠躬是的,我会利用它
if(pthread_create(&send,NULL,send_function,NULL)) {}
pthread_attr_t attr;
if (pthread_attr_init(&attr) != 0) {
perror("Error in pthread_attr_init()");
exit(EXIT_FAILURE);
}
if (pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) != 0) {
perror("Error in pthread_attr_setdetachstate()");
exit(EXIT_FAILURE);
}
if(pthread_create(&send, &attr, send_function, NULL)) {}