假设有两种并发线程类型,可以说 writer
和 reader
(其中 reader
线程在writer
编写后读取不同的元素。
writer
具有以下功能:
创建元素(假设有3种元素的类型)
增加元素库存(应该在创建阶段之后单独完成)
reader
具有以下功能:
在整个数据库中迭代一个单位,将元素库存还原为元素库存,直到每个插入的元素都有库存0(包括增加库存阶段后的库存)
)每个element
都有两个变量:
股票(整数)
内部数据(无效指针) ->可以用作程序员希望实现同步
为了避免种族条件,使用pthread_mutex
和pthread_cond_wait
功能。
我对 solve 的方法同时是:
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
NOTE :每个创建的元素都有1个单位库存。在update_stock之前,读者可能会将此元素减少一个单元,但这并不意味着该元素已从数据库
中删除我的问题是:
1)你们认为这是使用内部数据变量以同步操作的最有效方法吗?
2) write
操作在静音内部,但cond_wait
操作不在Mutex内部。在静音中进行此cond_wait
操作是严格的必要条件吗?
,如果您希望线程阻止直到有读取内容或打算以任何方式更改共享状态,则读取函数必须保持静音。pthread_cond_wait
的目的是阻止线程,释放其持有的静音,直到满足特定条件(在您的情况下是写入的),该条件是通过使用pthread_cond_signal
或pthread_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
这不包括检查错误。如果您俩都写/阅读要阻塞,则必须在上面的两个示例中混合。