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.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]