为读者偏好的读者 - 作者实施解决方案

时间:2014-04-10 16:52:18

标签: multithreading pthreads

我正在尝试为读者偏好实现读者 - 写作者问题的解决方案。 以下是问题陈述:

  1. 数据在一个编写器线程和多个读取器线程之间共享
  2. 如果编写者线程正在访问共享数据,则读者线程应该等待。
  3. 如果另一个读者线程正在访问共享数据,则读者线程不应该等待
  4. 我想出了以下伪代码。

    有人可以告诉我以下解决方案是否足够,以及它有什么问题?

    initialize()
    {
        initialize semaphore with value 0
        initialize reader_active_count with value 1
    }
    
    writer()
    {
        // Wait until reader thread makes the semaphore non-zero
        sem_wait(s)
    
        write data;
    
        sem_post(s)
       }
    
    reader()
    {
        lock(r1)
            reader_active_count ++;
    
            // Am I the first reader thread
            if (reader_active_count == 1)
            {
                // Wait until writer thread makes the semaphore non-zero
                sem_wait(s);
            }
        unlock(r1)
    
    
        read data
    
    
        lock(r1)
            reader_active_count--;
            // Am I the last reader thread
            if(reader_active_count == 0)
            {
                // Increment the sempahore to a non-zero value
                sem_post(s);
            }
        unlock(r1)
    }
    

1 个答案:

答案 0 :(得分:2)

虽然看起来你的代码会阻止多个编写器,并且在允许多次读取时会阻止并发写入和读取访问,但它不会比读者更喜欢读者。

考虑线程1正在写入并且线程2出现的情况,也想要写入。然后线程3想要阅读。

线程1将释放信号量,使其为非零。如果你的线程调度程序是公平的(即严格的FIFO),那么线程2将获得下一个信号量,因为它是第一个。如果您的调度程序不是严格的FIFO,则其中一个线程可以是下一个获取信号量的线程。

如果你想吸引读者而不是作家,那么你需要一些方法让读者在队列中获得更高的优先级。