2017-04-18 13 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であることは保証されていません。

関連する問題