pthread_rwlock_rdlock()和pthread_rwlock_wrlock()

时间:2018-07-31 17:48:24

标签: c multithreading

我对这些功能的行为规范一无所知。

想象一下这种情况:
T1,T2和T3是线程的名称。
连续执行操作。

    T1 calls pthread_rwlock_rdlock().
    T2 calls pthread_rwlock_wrlock() and wait because 
    rwlock is hold by T1.
    T3 calls pthread_rwlock_rdlock().
    T1 calls pthread_rwlock_unlock().

接下来是什么?

规范说:
“如果写入者未持有该写入者并且该写入者没有被阻塞,则调用线程将获得读取锁定”。

我无法理解T3是否会在T2之前抢占先机。
我希望是的。
你能解决我的问题吗?

1 个答案:

答案 0 :(得分:4)

如果支持线程执行调度,则应该能够选择它的工作方式。在pthread_rwlock_rdlock的手册页中:

  

如果支持“线程执行调度”选项,并且锁中涉及的线程正在按调度执行   策略SCHED_FIFO或SCHED_RR,则调用线程不得获取   作家持有的锁          锁,或者优先级较高或相等的写程序被阻止;否则,调用线程将获得该锁。

     

如果支持“线程执行调度”选项,并且锁中涉及的线程正在使用SCHED_SPORADIC执行   调度策略,如果发生以下情况,调用线程将不获取锁   作家握着锁          或具有更高或同等优先级的作者被锁定在锁上;否则,调用线程将获得该锁。

否则,它是实现定义的:

  

如果不支持“线程执行计划”选项,则由实现定义是否调用线程   当作家不持有锁并且有   作家封锁了锁。如果          编写者持有该锁,调用线程不得获取读取锁。如果未获得读锁,则调用线程应   阻止,直到它可以获取锁为止。调用线程可能会死锁   如果当时          进行调用,使其拥有写锁。