Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的线程安全代码不起作用?_C_Thread Safety - Fatal编程技术网

C 为什么我的线程安全代码不起作用?

C 为什么我的线程安全代码不起作用?,c,thread-safety,C,Thread Safety,我正在尝试为二进制搜索树创建一个线程安全的删除函数。下面的代码是我的结果,但它会导致程序死锁。锁出了什么问题?我试图对一些锁进行注释,但这会导致segfault struct bst_node { void* data; pthread_mutex_t mut; struct bst_node* left; struct bst_node* right; }; static void node_del(struct bst_node** node) { pth

我正在尝试为二进制搜索树创建一个线程安全的删除函数。下面的代码是我的结果,但它会导致程序死锁。锁出了什么问题?我试图对一些锁进行注释,但这会导致segfault

struct bst_node {
    void* data;
    pthread_mutex_t mut;
    struct bst_node* left;
    struct bst_node* right;
};

static void node_del(struct bst_node** node) {

pthread_mutex_lock(&(*node)->mut);

struct bst_node* old_node = *node;

if(((*node)->left == NULL) && ((*node)->right == NULL)) {
    *node = NULL;
    free_node(old_node);

} else if ((*node)->left == NULL) {
    pthread_mutex_lock(&((*node)->right->mut));
    *node = (*node)->right;
    free_node(old_node);
    pthread_mutex_unlock(&(*node)->mut);

} else if ((*node)->right == NULL) {
    pthread_mutex_lock(&((*node)->left->mut));
    *node = (*node)->left;
    free_node(old_node);
    pthread_mutex_unlock(&(*node)->mut);

} else {
    pthread_mutex_lock(&((*node)->left->mut));

    struct bst_node** pred = &(*node)->left;
    while ((*pred)->right != NULL) {

        pthread_mutex_lock(&(*pred)->right->mut);
        pthread_mutex_unlock(&(*pred)->mut);
        pred = &(*pred)->right;
    }

    void* temp = (*pred)->data;
    (*pred)->data = (*node)->data;
    (*node)->data = temp;

    pthread_mutex_unlock(&(*pred)->mut);

    node_del(pred);
}

}

注意,我已经在另一个函数中初始化了节点和锁“mut”。

第一个
pthread\u mutex\u锁(&(*node)->mut)
没有
pthread\u mutex\u unlock
。我认为这是您死锁的根本原因。

您对
free\u node()
的调用显然没有被锁定。您可能在函数中有锁-我们无法从这里判断。假设线程
t1
锁定了节点
n1
的互斥锁。现在假设线程
t2
已经锁定了节点
n2
的互斥锁。现在,如果
t1
尝试访问
n2
,当其互斥锁被锁定时,它将开始等待。同时,
t2
想要使用
n1
,但它被
t1
锁定。所以,僵局。似乎还有其他问题,但我上一篇评论中的问题也是一个潜在的僵局。小心那种情况。