使用条件变量的简单多线程堆栈实现

时间:2019-03-13 10:10:09

标签: c multithreading thread-safety pthreads posix

在我们的CS课程中,我们使用POSIX线程编程来实现 一个简单的堆栈数据结构。因此,我们使用了pthread_cond_waitpthread_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(...)后信号“有效”多长时间?

1 个答案:

答案 0 :(得分:2)

  

Q :我的实现问题是:由于信号的原因,这不要求阅读与写作之间的比例为1:1吗?这个   实现不允许写多个项目而没有任何   由于每次写入都需要在   读取功能(反之亦然,多次读取)。

如果write()函数确实类似于给出的read()函数,则为是和否。我认为您是在建议堆栈永远不能只有一个以上的元素,但事实并非如此。请注意,进入read()函数并找到非空堆栈的线程将如何完全忽略等待条件变量。如果堆栈为空,则线程仅等待读取。另一方面,类似的情况是线程仅在堆栈已满时才等待写入。

  

第二季度:调用pthread_cond_signal(...)后信号“有效”多长时间?

完全没有时间。发出CV信号时,只有已经等待条件变量的线程才能被解除阻塞。以后,即使没有线程被阻塞,也不会再存储任何已接收到的信号。