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

问题描述 投票:0回答:1

在我们的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由于信令?由于每次写入都需要在读取功能中触发的信号(反之亦然,多次读取),因此该实现不允许在没有任何读取的情况下写入多个项目。

我的理解是正确的还是我错过了什么?

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

c multithreading thread-safety pthreads posix
1个回答
2
投票

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

如果write()函数真的类似于read()函数,那么是和否。我认为你建议堆栈永远不会有多个元素,但特别是不是这样。注意进入你的read()函数并找到堆栈非空的线程如何完全绕过等待条件变量。只有堆栈为空时,线程才会等待读取。另一方面的模拟是线程只有在堆栈满容量时才等待写入。

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

没时间了。当发出CV信号时,只有已经等待条件变量的线程才能被解除阻塞。之后没有接收到任何信号的存储器,即使没有线程被它解除阻塞。

© www.soinside.com 2019 - 2024. All rights reserved.