gpt4 book ai didi

没有互斥量的条件等待

转载 作者:太空宇宙 更新时间:2023-11-04 03:39:15 24 4
gpt4 key购买 nike

假设有两种类型的并发线程,比如说 writerreader(其中 reader 线程读取不同的元素由 writer 编写)。

writer有以下功能:

+创建元素(假设有3种类型的元素)

+增加元素存量(应该在创建阶段之后单独做)

阅读器具有以下功能:

+遍历整个数据库,将元素库存减少一个单位,直到每个插入的元素都有库存 0(包括增加库存阶段后的库存)

每个元素有两个变量:

+库存(整数)

+内部数据(void pointer)-->可以按照程序员的意愿使用,以实现同步

为了避免竞争条件,使用了pthread_mutexpthread_cond_wait 函数。

同时解决这个问题的方法如下:

write
pthread_mutex_lock(&mutex)
set_internal_data(element_id, 1)
create_element(element_id)
pthread_cond_signal(&inserted,&mutex)
pthread_mutex_unlock(&mutex)

pthread_mutex_lock(&mutex)
set_internal_data(element_id, 1)
get_stock(element_id, prev_element_stock)
update_stock(element_id, prev_element_stock+ element_stock)
pthread_cond_signal(&inserted,&mutex)
pthread_mutex_unlock(&mutex)

read
get_internal_data(element_id, element_internal_data)
while(element_internal_data)
pthread_cond_wait(&inserted,&mutex)
read operation

注意:每个创建的元素都有 1 个库存单位。在 update_stock 之前,读者可能会将该元素减少一个单位,但这并不意味着该元素已从数据库中删除

我的问题是:

1)你们认为这是使用内部数据变量来同步操作的最有效方法吗?

2) write 操作在互斥量内,但 cond_wait 操作不在互斥量内。在互斥体中执行此 cond_wait 操作是绝对必要的吗?

最佳答案

如果您希望线程阻塞直到有内容要读取或者您打算以任何方式更改共享状态,则读取函数必须持有一个互斥量。 pthread_cond_wait 的目标是阻塞线程,释放它持有的互斥锁,直到满足特定条件(在您的情况下已写入某些内容),这是通过使用 pthread_cond_signalpthread_condition_broadcast,之后它将重新获取互斥量并继续读取。

对于写入操作,我认为函数名称中有拼写错误,但函数应如下所示:

pthread_mutex_lock(&mutex)
write_to_the_shared_state
pthread_cond_signal(&cond) / pthread_cond_broadcast(&cond)
pthread_mutex_unlock(&mutex)

为了阅读

pthread_mutex_lock(&mutex)
while(data = try_to_read)
pthread_cond_wait(&cond, &mutex)
pthread_mutex_unlock(&mutex)
return data

这不包括错误检查。如果你写/读都被阻塞,你将不得不混合上面的两个例子。

关于没有互斥量的条件等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30006829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com