2

下面的程序给我随机实例的分段错误(核心转储)错误。有时它运行没有任何错误。该程序仅用于理解死锁。

尽管我已经运行了这个程序大约 15 次,但到目前为止我还没有遇到死锁。有时程序运行顺利(这是可以预料的),有时它会给出分段错误(这不是预期的)。为什么会出现分段错误?

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

int a=5;
int b=3;

pthread_mutex_t mutex1,mutex2;


void* add_subtract(){

    pthread_mutex_lock(&mutex1);
    pthread_mutex_lock(&mutex2);
    a=a+2;
    b=b-2;
    printf("%d %d\n",a,b);
    pthread_mutex_unlock(&mutex2);
    pthread_mutex_unlock(&mutex1);



}


void* subtract_add(){


    pthread_mutex_lock(&mutex2);
    pthread_mutex_lock(&mutex1);
    b=b-2;
    a=a+2;
    printf("%d %d\n",a,b);

    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex2);

}
int main(){

    pthread_t thread1,thread2;
    pthread_create(&thread1,NULL,add_subtract(),NULL);
    pthread_create(&thread2,NULL,subtract_add(),NULL);
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    return 0;

}

4

2 回答 2

2

当您add_subtract()作为参数传递时,您正在调用函数,然后将返回值作为参数传递。在这种情况下,您想传递函数本身......在没有括号的情况下尝试。

于 2013-05-24T04:29:14.980 回答
1

我认为您需要初始化互斥锁:http: //pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html

pthread_mutex_init() 函数使用 attr 指定的属性初始化由 mutex 引用的互斥锁。如果 attr 为 NULL,则使用默认的 mutex 属性;效果与传递默认互斥体属性对象的地址相同。成功初始化后,互斥锁的状态变为初始化并解锁。

于 2013-05-24T04:28:13.400 回答