以下程序在随机实例上给出分段错误(核心转储)错误。有时它运行没有任何错误。该程序仅用于理解死锁。
即使我已经运行了这个程序大约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;
}
答案 0 :(得分:2)
当您将add_subtract()
作为参数传递时,您调用函数,然后将返回值作为参数传递。在这种情况下,你想要传递函数本身...尝试没有parens。
答案 1 :(得分:1)
我认为您需要初始化互斥锁:http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html
pthread_mutex_init()函数初始化引用的互斥锁 具有attr指定的属性的互斥锁。如果attr为NULL,则为默认值 使用互斥锁属性;效果和传球一样 默认互斥锁属性对象的地址。一旦成功 初始化时,互斥锁的状态变为初始化状态 解锁。