库pthread.h
中有pthread_rwlock_t
个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不会释放锁,直到所有线程都试图获得锁定。
答案 0 :(得分:1)
我做了一些研究,发现this document from the Oracle website解释了pthread读写锁的调度策略。
如果对pthread_rwlock_unlock()的调用导致读写锁定对象变为解锁并且有多个线程等待获取读写锁定对象以进行写入,则调度策略用于确定哪个线程获取读取-write用于写入的锁定对象。如果有多个线程等待获取读写锁对象以进行读取,则调度策略用于确定等待线程获取读写锁对象以供读取的顺序。 如果rwlock上有多个线程阻塞了读锁定和写锁定,则未指定读取器是先获取锁定还是编写器是否先获取锁定。
总之,它们不能保证是FIFO。