Multithreading 具有读者偏好的读者-作者实现方案

Multithreading 具有读者偏好的读者-作者实现方案,multithreading,pthreads,Multithreading,Pthreads,我正在尝试为读者-作者问题实施一个解决方案,解决读者偏好问题。 以下是问题陈述: 数据在一个写线程和多个读线程之间共享 如果写入线程正在访问共享数据,则读线程应等待 如果另一个读卡器线程正在访问共享数据,则读卡器线程不应等待 我提出了以下伪代码 有人能告诉我下面的解决方案是否足够,有什么问题吗 initialize() { initialize semaphore with value 0 initialize reader_active_count with value 1 }

我正在尝试为读者-作者问题实施一个解决方案,解决读者偏好问题。 以下是问题陈述:

  • 数据在一个写线程和多个读线程之间共享
  • 如果写入线程正在访问共享数据,则读线程应等待
  • 如果另一个读卡器线程正在访问共享数据,则读卡器线程不应等待
  • 我提出了以下伪代码

    有人能告诉我下面的解决方案是否足够,有什么问题吗

    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正在写入,而线程2也正在写入的情况。然后线程3想要读取

    线程1将释放信号量,使其非零。如果线程调度程序是公平的(即严格意义上的FIFO),那么线程2接下来将获取信号量,因为它是第一行。如果您的调度程序不是严格意义上的FIFO,那么任何一个线程都可以是下一个获取信号量的线程


    如果你想让读者优先于作者,那么你需要某种方式让读者在队列中享有更高的优先级。

    谢谢你的评论。在您提到的场景中,线程3应该释放信号量,因为只有当读卡器\u active\u计数达到0时才释放信号量。@achitmehta:Yes。只有当线程3在等待第一次锁定时被阻塞,而线程1在清理时将其锁定时,才会出现争用条件。然后线程1将是最后一个读卡器并释放信号量,让线程2在线程3增加
    读卡器活动\u计数之前获取信号量。