【问题标题】:Implementing solution for readers-writers with readers preference为具有读者偏好的读者-作者实施解决方案
【发布时间】:2014-04-10 16:52:18
【问题描述】:

我正在尝试针对读者偏好的读写器问题实施解决方案。 以下是问题陈述:

  1. 数据在一个写入线程和多个读取线程之间共享
  2. 如果写入线程正在访问共享数据,读取线程应该等待。
  3. 如果另一个读取器线程正在访问共享数据,读取器线程不应等待

我想出了以下伪代码。

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

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)
}

【问题讨论】:

    标签: multithreading pthreads


    【解决方案1】:

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

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

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

    如果你想优先考虑读者而不是作者,那么你需要一些方法来让读者在队列中拥有更高的优先级。

    【讨论】:

    • 感谢您的评论。在您提到的场景中,线程 3 应该释放信号量,因为只有当 reader_active_count 达到 0 时才会释放信号量。
    • @AchintMehta:是的。唯一一次出现竞争条件是线程 3 被阻塞等待第一个锁,而线程 1 在清理时将其锁定。然后线程 1 将成为最后一个读取器并将释放信号量,让线程 2 在线程 3 可以增加 reader_active_count 之前获取它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2022-11-14
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    相关资源
    最近更新 更多