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