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

时间:2014-02-20 16:11:49

标签: c thread-safety

我正在尝试为二叉搜索树创建一个线程安全删除函数。下面的代码是我的结果,但它导致程序死锁。锁有什么问题?我试图评论一些锁,但这导致了段错误......

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”。

1 个答案:

答案 0 :(得分:0)

第一个pthread_mutex_lock(&(*node)->mut)没有pthread_mutex_unlock。我认为这是导致僵局的根本原因。