В библиотеке 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 не снимает блокировку, пока все потоки не попытаются получить блокировку.
Я провел некоторое исследование и нашел этот документ с сайта Oracle это объясняет политику планирования для блокировок чтения и записи pthread.
Если вызов pthread_rwlock_unlock () приводит к тому, что объект блокировки чтения-записи становится разблокированным, и есть несколько потоков, ожидающих получения объекта блокировки чтения-записи для записи, политика планирования используется, чтобы определить, какой поток получает блокировку чтения-записи Объект для записи. Если имеется несколько потоков, ожидающих получения объекта блокировки чтения-записи для чтения, политика планирования используется для определения порядка, в котором ожидающие потоки получают объект блокировки чтения-записи для чтения. Если в rwlock заблокированы несколько потоков как для блокировок чтения, так и блокировок записи, неизвестно, получат ли блокировку читатели первыми или блокировщик получит блокировку первыми.
Таким образом, в заключение, они не гарантированы, чтобы быть FIFO.
Других решений пока нет …