2017-04-18 4 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

FIFO라는 용어는 여기에 적용되지 않는다고 생각합니다. 스레드가 어떤 순서로도 실행되는 것은 아닙니다. 그리고 그러한 것들에 대한 가정을하면 종종 멀티 스레딩 문제가 발생합니다. _imagine_ 구문은 실제로는 다른 방향이므로 의미가 없습니다. 잠긴 스레드가 실행될 스레드입니다. – VTT

+0

'thread1'에서'join'을 호출하고'thread1'이 끝날 때까지 기다릴 수 있습니다. ''스레드는 잠금에 대한 스케줄링 정책에 따라 다르므로 반드시 순서대로 실행하지 않아도됩니다. 'read-write' 락 대신 간단하게'뮤텍스 (mutex) '를 사용한다면'뮤텍스 (mutex)'내에서'FIFO' 스케줄링 정책을 사용하여 스레드가 순차적으로 실행되도록 보장 할 수 있습니다. –

답변

1

나는 약간의 연구를했고 pthread 읽기 - 쓰기 잠금에 대한 스케줄링 정책을 설명하는 this document from the Oracle website을 발견했다. pthread_rwlock_unlock()에 대한 호출이 읽기 - 쓰기 락 객체의 결과 잠금이 해제되고 여러 스레드가 쓰기에 읽기 - 쓰기 잠금 객체를 얻기 위해이 기다리고 있습니다, 스케줄링 정책이있는 스레드를 결정하는 데 사용되는 경우

쓰기를 위해 읽기 - 쓰기 잠금 객체를 얻습니다. 읽기를 위해 읽기 - 쓰기 잠금 오브젝트를 확보하기 위해 대기중인 스레드가 여러 개인 경우, 대기중인 스레드가 읽기 위해 읽기 - 쓰기 잠금 오브젝트를 확보하는 순서를 결정하는 데 스케줄링 정책이 사용됩니다. 읽기 잠금과 쓰기 잠금 모두에 대해 rwlock에서 차단 된 스레드가 여러 개인 경우 먼저 읽기 기가 잠금을 먼저 획득하는지 라이터가 먼저 잠금을 획득하는지 여부가 지정되지 않습니다.

따라서 결론적으로 FIFO 일 수는 없습니다.