【问题标题】:concurrent readers and mutually excluding writers in C using pthreads使用 pthreads 在 C 中并发读取器和相互排除的写入器
【发布时间】:2013-04-03 17:44:20
【问题描述】:

我希望是否有人可以转发或向我展示一个程序,该程序具有多个读者但相互排斥 C 中的作者。我在整个互联网上搜索了它,但找不到使用粗粒度显示此行为的单个示例锁定。我知道我可以使用 pthread_rwlock_init、pthread_rwlock_rdlock 等,我只是不知道如何使用它。我通过例子学习,这就是我在这里的原因。

假设我有一个代码区域(不是共享变量)并且我想要多次读取,但只有一个写入器,这就是我不知道如何使用 pthreads rwlocks 来完成的。我不明白代码如何知道现在它正在被写入,与现在它正在被读取相比。 谢谢。

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

    您可以查看 Peter Chapin 的 Pthread Tutorial 第 24 页的示例。我在下面添加了它。

    #include<pthread.h>
    int shared;
    pthread_rwlock_t lock ;
    void∗ thread_function (void∗ arg)
    {
      pthread_rwlock_rdlock (&lock);
      //Read from the shared resource.
      pthread_rwlock_unlock(&lock);
    }
    void main( void )
    {
      pthread_rwlock_init(&lock, NULL);
      // Start threads here.
      pthread_rwlock_wrlock(& lock );
      // Write to the shared resource .
      pthread_rwlock_unlock(&lock);
      // Join_with threads here .
      pthread_rwlock_destroy(&lock);
      return 0 ;
    }
    

    【讨论】:

    • 所以现在,我可以读两遍了,如果我想写,读还没读完怎么办?它是否等待读取完成然后写入?还有,你有了写锁之后,是不是还需要解开写锁,这样我们以后可以腾出空间来读?
    • @user2241639 它是一个读/写锁。只要至少有一个读卡器持有锁,就没有写卡器可以拿走它。同样,只要写入者拥有锁,就没有读取者或写入者可以获取锁。你的下一个问题,是的,对于等待大量读者放弃锁的给定作家来说,线程饥饿的可能性是非常真实的。
    • @WhozCraig 所以如果一个人正在阅读,而作者想要写作,他是在排队,还是实际的写作尝试失败了?
    • @user2241639 写入器阻塞,直到所有读取器和/或另一个写入器释放锁定。对于获得写锁的写入器,没有人可以拥有任何锁。对于读者获得读锁,没有写者可以拥有写锁。我希望这很清楚。
    • 写入器获取锁失败,阻塞。他没有机会写作。请注意,还有一些调用的尝试版本会尝试锁定,但会返回一个值,说明是否获得了锁定。您可以使用它来尝试获取锁,但如果它不可用,则不会阻止。
    猜你喜欢
    • 2023-04-08
    • 2013-12-09
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2014-04-28
    • 2018-01-18
    相关资源
    最近更新 更多