【问题标题】:Simple Multi-threading Stack Implementation using Conditional Variables使用条件变量的简单多线程堆栈实现
【发布时间】:2019-08-03 23:21:41
【问题描述】:

在我们的 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 函数的实现方式类似,但锁定 write_mutex 并改为发送 read_cond 信号。

问: 我对这个实现的问题是:由于信号传输,这是否不需要读取和写入之间的 1:1 比率?此实现不允许在没有任何读取的情况下写入多个项目,因为每次写入都需要在读取函数中触发信号(反之亦然,多次读取)。

我的理解是正确的还是我遗漏了什么?

Q2调用pthread_cond_signal(...)后,信号“有效”多长时间?

【问题讨论】:

    标签: c multithreading thread-safety pthreads posix


    【解决方案1】:

    :我对这个实现的问题是:由于信号的原因,这是否需要读取和写入之间的 1:1 比率?这 实现不允许在没有任何内容的情况下编写多个项目 之间读取,因为每次写入都需要在 读取功能(反之亦然多次读取)。

    如果write() 函数确实类似于所提供的read() 函数,那么是和否。我认为您是在暗示堆栈永远不能有多个元素,但事实并非如此。请注意进入read() 函数并发现堆栈非空的线程将如何完全绕过等待条件变量。仅当堆栈为空时,线程才等待读取。另一方面,线程只有在堆栈已满时才会等待写入。

    Q2调用 pthread_cond_signal(...) 后信号“有效”多长时间?

    根本没有时间。当 CV 发出信号时,只有已经在等待条件变量的线程才能被解除阻塞。之后没有任何关于接收到信号的记忆,即使没有线程被它解除阻塞。

    【讨论】:

      猜你喜欢
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多