因此,我有一个使用数据缓冲区的“生产者和消费者”程序,现在我想使缓冲区成为数据的流动流。
我为数据缓冲区创建了一个类似链表的数据结构。 有一个复杂的对象,该对象存储指向链接列表的开头和结尾的指针。
也许这些术语是不正确的,但是我的意思是“下一个”去了哪里。 (随时纠正我的问题)
我需要将新项目添加到列表的开头,但是,由于我正在使用线程,因此需要锁定缓冲区对象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;
答案 0 :(得分:1)
是的,您可以这样做,这完全可以。
您不需要更改互斥量本身,但是变量会指向它,因此,在访问指向的互斥量时,没有任何区别。 (在这里,您甚至没有保持指向互斥锁的指针,而是指向bf_head成员)
也就是说,我不确定您的代码是否完全不存在竞争,但这是另一回事了:)