简单的 pthread 程序:分段错误

Simple pthread prog: segmentation fault

试图通过 运行 一个简单程序查看 pthread 的工作原理,但我在 pthread_create

处遇到分段错误(核心已转储)
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

void* testfunc(void* arg) {
  while (1) {
    printf("testfunc");
  }
}

int main(void) {
  printf("helo\n");

  if (pthread_create(NULL, NULL, &testfunc, NULL) != 0) {
    perror("pthread failed to create\n");
  }

  while (1) {
    printf("main function\n");
    sleep(1000);
  } 

  return 0;
}

似乎是什么导致了这个问题?如果重要的话,我在 Ubuntu 20.04。

您不能为 pthread_create 的第一个参数传递 NULL

Before returning, a successful call to pthread_create() stores the ID of the new thread in the buffer pointed to by thread

另外,pthread_create 没有设置 errno,所以使用 perror 没有任何意义,至少在没有一些准备的情况下是这样。

on error, it returns an error number, and the contents of *thread are undefined.

固定:

pthread_t thread;
if ( ( errno = pthread_create(&thread, NULL, &testfunc, NULL) ) != 0 ) {
    perror("pthread failed to create\n");
}

...

pthread_join(thread, ...);  // Normally.

c 中的线程非常无情。我可以看到您的代码存在一些问题。

首先,您可能需要参考 p_thread 的开发者文档。他们有很好的记录。您当前拥有的是一个线程调用,但您没有指向该线程的任何内容。这就是您收到分段错误的原因。这意味着您的程序在尝试调用它时在某处丢失了指向该线程的指针。我建议类似的东西。

pthread_t thread;
int * argument = 5;
if(pthread_create(&thread,NULL, &testfunc, &argument) !=0){
//                                        ^This is a pointer to your argument 
//                                         that you want to pass in
   perror("pthread failed to create\n");
   exit(1);
}

并且您的线程函数还需要从空指针类型转换为您希望它 return 使用的任何内容。然后需要在从线程例程 returned 之前将其转换回空指针。

void* testfunc(void* arg){
  int* testVar = (int *)arg;

  // do some logic here

  return (void *) testVar;
}

最后,您要对 C 中的内存负责,因此您必须在退出前终止您创建的线程。

pthread_join(thread, NULL);

我的第一个建议是你看一些相关的视频。