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(&amp;mutex)

【讨论】:

以上是关于pthread 和 mutex_lock 抛出分段核心转储的主要内容,如果未能解决你的问题,请参考以下文章

C pthread:分段错误

在 g++ 中是在后台使用 pthreads 的 C++ 11 线程模型吗?

使用 pthread_create 时出现“分段错误(核心转储)”

pthread_create 上的分段错误

Pthread_create 在 C++ 中导致分段错误

使用pthread_create时的“分段错误(核心转储)”