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)) {}