読み書きロックの優先度の問題が解決しました
2391 ワード
この問題は、共有するデータのレイアウトに対して、読む頻度は書くよりはるかに大きいので、読み書きロックを使った.しかし、書き込みスレッドは常にロックを奪うことができないことに気づいた.
The Open GroupのSingle UNIXを押しますか?Specificationは"Thepthread_rwlock_rdlock() function applies a read lock to the read-write lock referenced by rwlock. The calling thread acquires the read lock if a writer does not hold the lock and there are no writers blocked on the lock. It is unspecified whether the calling thread acquires the lock when a writer does not hold the lock and there are writers waiting for the lock」とは、writerが書き込みロックを待っていない場合、readerは読み取りロックを手に入れることができるという意味です.しかし、画定はありません.writerが書き込みロックを期待している場合、どうすればいいですか.
Linuxにはpthreadがありますrwlockattr_setkind_npという関数は、manでは調べられないことを残念に思っています.私はpthreadです.hヘッダファイルで発見されました.
これを見て、このことはこんなに簡単に解決したのではないかと思います.黙認はreader優先、writer優先に変えればいいんじゃないですか?さっとコードを書くと同時に、ネットで検索してみると、csdnでこの関数の使い方を真剣に教えてくれる人もいます.ちぇっ!
pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);
役に立たない!どうしてですか.manページもないので、この関数が実現していないのではないかと疑って、debuginfo-install glibc?glibcのデバッグ記号を入れてgdbでフォローするとpthread_が見つかりますrwlockattr_setkind_npは確かに実装されており,コードは簡単でattrのメンバー変数を変更した.それはなぜですか.
グーグルは結局pthreadを見つけたrwlockattr_setkind_npのman page、末尾にnotesがあって、私を年夜汗にさせます:
“Setting the value read-write lock kind to PTHREAD_RWLOCK_PREFER_WRITER_NP, results in the same behavior as setting the value to PTHREAD_RWLOCK_PREFER_READER_NP. As long as a reader thread holds the lock the thread holding a write lock will be starved. Setting the kind value to PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, allows the writer to run. However, the writer may not be recursive as is implied by the name. “
つまりPTHREAD_RWLOCK_PREFER_WRITER_NPとPTHREAD_RWLOCK_PREFER_WRITER_NPは同じです!PTHREAD_に設定する必要がありますRWLOCK_PREFER_WRITER_NONRECURSIVE_NPが正しい!でもPTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NPも名実ともに死滅しているので、recursiveはできません.
The Open GroupのSingle UNIXを押しますか?Specificationは"Thepthread_rwlock_rdlock() function applies a read lock to the read-write lock referenced by rwlock. The calling thread acquires the read lock if a writer does not hold the lock and there are no writers blocked on the lock. It is unspecified whether the calling thread acquires the lock when a writer does not hold the lock and there are writers waiting for the lock」とは、writerが書き込みロックを待っていない場合、readerは読み取りロックを手に入れることができるという意味です.しかし、画定はありません.writerが書き込みロックを期待している場合、どうすればいいですか.
Linuxにはpthreadがありますrwlockattr_setkind_npという関数は、manでは調べられないことを残念に思っています.私はpthreadです.hヘッダファイルで発見されました.
enum
{
PTHREAD_RWLOCK_PREFER_READER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP
};
?
extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
int __pref) __THROW __nonnull ((1));
これを見て、このことはこんなに簡単に解決したのではないかと思います.黙認はreader優先、writer優先に変えればいいんじゃないですか?さっとコードを書くと同時に、ネットで検索してみると、csdnでこの関数の使い方を真剣に教えてくれる人もいます.ちぇっ!
pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);
役に立たない!どうしてですか.manページもないので、この関数が実現していないのではないかと疑って、debuginfo-install glibc?glibcのデバッグ記号を入れてgdbでフォローするとpthread_が見つかりますrwlockattr_setkind_npは確かに実装されており,コードは簡単でattrのメンバー変数を変更した.それはなぜですか.
グーグルは結局pthreadを見つけたrwlockattr_setkind_npのman page、末尾にnotesがあって、私を年夜汗にさせます:
“Setting the value read-write lock kind to PTHREAD_RWLOCK_PREFER_WRITER_NP, results in the same behavior as setting the value to PTHREAD_RWLOCK_PREFER_READER_NP. As long as a reader thread holds the lock the thread holding a write lock will be starved. Setting the kind value to PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, allows the writer to run. However, the writer may not be recursive as is implied by the name. “
つまりPTHREAD_RWLOCK_PREFER_WRITER_NPとPTHREAD_RWLOCK_PREFER_WRITER_NPは同じです!PTHREAD_に設定する必要がありますRWLOCK_PREFER_WRITER_NONRECURSIVE_NPが正しい!でもPTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NPも名実ともに死滅しているので、recursiveはできません.