在我们的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的比例吗?由于每次写入都需要在读取功能中触发一个信号(因此多次读取),因此此实现方法不允许写入多个项目而之间不进行任何读取。
我的理解正确吗?还是我缺少什么?
第二季度:呼叫pthread_cond_signal(...)
后信号“有效”多长时间?
答案 0 :(得分:2)
Q :我的实现问题是:由于信号的原因,这不要求阅读与写作之间的比例为1:1吗?这个 实现不允许写多个项目而没有任何 由于每次写入都需要在 读取功能(反之亦然,多次读取)。
如果write()
函数确实类似于给出的read()
函数,则为是和否。我认为您是在建议堆栈永远不能只有一个以上的元素,但事实并非如此。请注意,进入read()
函数并找到非空堆栈的线程将如何完全忽略等待条件变量。如果堆栈为空,则线程仅等待读取。另一方面,类似的情况是线程仅在堆栈已满时才等待写入。
第二季度:调用pthread_cond_signal(...)后信号“有效”多长时间?
完全没有时间。发出CV信号时,只有已经等待条件变量的线程才能被解除阻塞。以后,即使没有线程被阻塞,也不会再存储任何已接收到的信号。