pthread 和 mutex_lock 抛出分段核心转储
Posted
技术标签:
【中文标题】pthread 和 mutex_lock 抛出分段核心转储【英文标题】:pthread and mutex_lock throwing segmentation core dumped 【发布时间】:2022-01-17 04:36:40 【问题描述】:我正在尝试使用 mutex 来使用 threads 进行同步,但似乎我的代码抛出了“segmentation fault core dumped " 每次编译后都会出错。
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
int *s = 0;
void *fonction(void * arg0)
pthread_mutex_lock( & mutex);
*s += *((int *)arg0) * 1000000;
pthread_mutex_unlock(&mutex);
int main()
pthread_t thread[5];
int ordre[5];
for (int i = 0; i < 5; i++)
ordre[i] = i;
for (int i = 0; i < 5; i++)
pthread_create(&thread[i], NULL, fonction, & ordre[i]);
for (int i = 0; i < 5; i++)
pthread_join(thread[i], NULL);
printf("%d\n", * s);
return 0;
【问题讨论】:
你没有初始化你的mutex
。您可以使用pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
初始化全局变量
谢谢,但仍然抛出相同的错误。我将再次尝试查看我的代码
s
未初始化,未指向有效内存。
确认!摆脱那些5
并使用常量或变量!
当然感谢 lmao 使用常量让你的代码总是更具可读性
【参考方案1】:
两件事:
您在此处取消引用 NULL 指针:
*s += *((int *)arg0) * 1000000;
因为您在全局范围内定义了int *s = 0;
。您可能想将其定义为 int s = 0;
,然后在各处使用 s
而不是 *s
。
As noted by Rainer Keller 在 cmets 中,你没有初始化你的 mutex
。您应该将其静态初始化为PTHREAD_MUTEX_INITIALIZER
,或者在运行时在main
中使用pthread_mutex_init(&mutex)
。
【讨论】:
以上是关于pthread 和 mutex_lock 抛出分段核心转储的主要内容,如果未能解决你的问题,请参考以下文章
在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?