在我们的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信号时,只有已经等待条件变量的线程才能被解除阻塞。之后没有接收到任何信号的存储器,即使没有线程被它解除阻塞。