[英]Simple Multi-threading Stack Implementation using Conditional Variables
在我们的CS课程中,我们使用POSIX线程编程来实现简单的堆栈数据结构。 因此,我们使用了pthread_cond_wait
和pthread_cond_signal
:
pthread_mutex_t write_mutex;
pthread_mutex_t read_mutex;
pthread_cond_t write_cond;
pthread_cond_t read_cond;
int read()
{
pthread_mutex_lock(&read_mutex);
while(is_empty())
{
pthred_cond_wait(&read_cond, &read_mutex);
}
// read value [...]
pthread_cond_signal(&write_cond);
pthread_mutex_unlock(&read_mutex);
return read_value;
}
写函数的实现类似,但锁定write_mutex
信号read_cond
。
问:我的实现问题是:由于信号的缘故,这在阅读文章与写作之间是否不需要1:1的比例吗? 由于每次写入都需要在读取功能中触发一个信号(因此多次读取),因此此实现方法不允许写入多个项目而之间不进行任何读取。
我的理解正确吗?还是我缺少什么?
Q2调用pthread_cond_signal(...)
后信号“有效”多长时间?
问 :我的实现问题是:由于信号的缘故,这在阅读文章与写作之间是否不需要1:1的比例吗? 由于每次写入都需要在读取功能中触发一个信号(因此多次读取),因此此实现方法不允许写入多个项目而之间不进行任何读取。
如果write()
函数确实类似于所示的read()
函数,则为是和否。 我认为您是在建议堆栈永远不能只有一个以上的元素,但事实并非如此。 请注意,进入您的read()
函数并查找非空堆栈的线程将如何完全绕过条件变量的等待。 如果堆栈为空,则线程仅等待读取。 另一方面,类似的情况是线程仅在堆栈已满时才等待写入。
Q2调用pthread_cond_signal(...)后信号“有效”多长时间?
根本没有时间。 发出CV信号时,只有已经等待条件变量的线程才能被解除阻塞。 此后,即使没有线程被阻塞,也没有任何已接收信号的存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.