2017-04-18 134 views
1

在库中pthread.hpthread_rwlock_t FIFO?pthread读写锁定FIFO?

在下面的例子中,我们有多个线程。想象一下,每个线程都保证按顺序运行。

// Thread 1 - does a write lock 
pthread_rwlock_wrlock(&lock); 

// Thread 2 - does a read but has to wait for 1 
pthread_rwlock_rdlock(&lock); 

// Thread 3 - does a read but has to wait for 1 
pthread_rwlock_rdlock(&lock); 

// Thread 4 - does a write but has to wait for 1 
pthread_rwlock_wrlock(&lock); 

// Thread 1 - unlocks 
pthread_rwlock_unlock(&lock); 

// who gets the lock? 

线程1释放锁后,谁锁?是否保证线程2和线程3?或者它可能被给予4?

再次,想象一下,每个线程都保证按顺序运行,线程1不会释放锁,直到所有线程都试图获得锁。

+1

我认为这个词在这里不适用。线程不保证以任何顺序运行。对这些事情做出假设通常会导致多线程问题。你的_imagine_短语是毫无意义的,因为它实际上是另一种方式:获得锁定的线程是将要运行的线程。 – VTT

+0

你可以在'thread 1'上调用'join',并保证它们等待'thread 1'完成。至于'''线程不保证以任何顺序运行“,这不一定是正确的,因为它取决于锁的调度策略。如果不是'读写'锁,我们有一个简单的'互斥锁',我们可以保证这些线程按照'mutex'中的'FIFO'调度策略的顺序运行。 –

回答

1

我做了一些研究,发现this document from the Oracle website解释了pthread读写锁的调度策略。

如果与pthread_rwlock_unlock()的调用导致读写锁定对象成为解锁并且有多个线程等待获取读写锁定对象进行写入,所述调度策略被用于确定哪个线程获取用于写入的读写锁对象。如果有多个线程等待读取读写锁对象,则调度策略用于确定等待线程获取读写锁对象的顺序。 如果在读锁和写锁时rwlock上有多个线程被阻塞,那么读者是先获取锁还是写者是否首先获取锁,这是未指定的。

因此,总而言之,它们不保证是FIFO。