【问题标题】:pthread and mutex_lock throwing segmentation core dumpedpthread 和 mutex_lock 抛出分段核心转储
【发布时间】: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 使用常量让你的代码总是更具可读性

标签: c pthreads


【解决方案1】:

两件事:

  1. 您在此处取消引用 NULL 指针:

    *s += *((int *)arg0) * 1000000;
    

    因为您在全局范围内定义了int *s = 0;。您可能想将其定义为 int s = 0;,然后在各处使用 s 而不是 *s

  2. As noted by Rainer Keller 在 cmets 中,你没有初始化你的 mutex。您应该将其静态初始化为PTHREAD_MUTEX_INITIALIZER,或者在运行时在main 中使用pthread_mutex_init(&amp;mutex)

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 2018-05-23
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多