简单的 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);
我的第一个建议是你看一些相关的视频。
试图通过 运行 一个简单程序查看 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 bythread
另外,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);
我的第一个建议是你看一些相关的视频。