互斥体指针在锁定状态期间是否可以更改?

时间:2018-10-28 16:30:29

标签: c locking mutex

因此,我有一个使用数据缓冲区的“生产者和消费者”程序,现在我想使缓冲区成为数据的流动流。

我为数据缓冲区创建了一个类似链表的数据结构。 有一个复杂的对象,该对象存储指向链接列表的开头和结尾的指针。

也许这些术语是不正确的,但是我的意思是“下一个”去了哪里。 (随时纠正我的问题)

我需要将新项目添加到列表的开头,但是,由于我正在使用线程,因此需要锁定缓冲区对象fir。所以我的问题是:在更改互斥锁后可以解锁互斥锁吗?

在这段代码中,我尝试保留对bf_head的引用,以便以后可以对其进行解锁:

void *producer(void *args)
{
    /* some code */
    pthread_mutex_lock(&co->bf_head->lock);
        bf_tmp = co->bf_head;
        co->bf_head->next = bf_new;
        co->bf_head = bf_new;
    pthread_mutex_unlock(&bf_tmp->lock);
    /* some code */
}

其中:

struct complex_obj *co = args;
struct buffer *bf_new;
struct buffer *bf_tmp;

和:

typedef struct complex_obj
{
    struct file_acess *file_acess;
    struct buffer *bf_head;
    struct buffer *bf_tail;
    struct stat *stat;
}s_complex_obj;

typedef struct buffer
{
    char *line;
    struct buffer *next; //for liknked list
    pthread_mutex_t lock;
    pthread_cond_t cons_cond; //not used yet
    int full; //-1 at the end
}s_buffer;

1 个答案:

答案 0 :(得分:1)

是的,您可以这样做,这完全可以。

您不需要更改互斥量本身,但是变量会指向它,因此,在访问指向的互斥量时,没有任何区别。 (在这里,您甚至没有保持指向互斥锁的指针,而是指向bf_head成员)

也就是说,我不确定您的代码是否完全不存在竞争,但这是另一回事了:)