問題描述:
我們的應用程式採用了共享記憶體和讀寫鎖的機制來實現多程序的併發訪問,但測試時發現讀寫鎖有問題,我們所採用的鎖是pthread_rwlock_rdlock、pthread_rwlock_wrlock這組函式。
現象:pthread_rwlockattr_setpshared(&attr,pthread_process_shared);呼叫出錯,返回**38,經查是系統不支援的原因。
系統環境:
uname -a
linux s12084 2.6.9-67.elsmp #1 smp wed nov 7 13:58:04 est 2007 i686 i686 i386 gnu/linux
g++ 3.2.3
問題解決:
因為之前在這種環境執行過,所以懷疑可能是補丁或者系統的版本問題,後來發現 .bash_profile中有下面這行:
export ld_assume_kernel=2.4.19 #for build oracle db
原來這是裝oracle 時新增的,當時安裝oracle有問題才加上的。
這種情況下檢視關於讀寫鎖的測試程式,此時執行:ldd locktest ,顯示
/lib/libcwait.so (0x00eb0000)
libpthread.so.0 => /lib/i686/libpthread.so.0 (0x003d3000) ----和下面所採用的libpthread不是用的同乙個目錄下的庫。
執行 unset ld_assume_kernel 後
此時執行:ldd locktest
/lib/libcwait.so (0x00f19000)
libpthread.so.0 => /lib/tls/libpthread.so.0 (0x00b8e000) ---tls目錄所採用的libpthread是能保證讀寫鎖正確性的,上面的不支援讀寫鎖。
通過去掉 ld_assume_kernel ,則系統連線到了tls目錄下的libpthread.so.0,此時讀取鎖功能正常了。
關於linux下的執行緒庫的資料可以參考:
http://www.cublog.cn/u/6303/showart_472641.html 有關於這個問題的詳細的解釋。
通過這個問題,也說明了,linux2.4.19之前的版本 對程序間的讀寫鎖支援是有問題的,或者說是不支援的。
另外http://www.ibm.com/developerworks/cn/linux/porting/solaris/guide1/index.html中提到的:
要使用 posix 執行緒的read/write lock擴充套件,您必須在編譯時定義:
_xopen_source=500
這要在加入 標頭檔案之前完成,還要定義:
_posix_c_source=199506l
linux 執行緒不實現共享程序的互斥、條件和訊號。該擴充套件的目的是允許不同的程序(有不同位址空間的程序)在共享記憶體中(svr4 共享記憶體片段或對映的 mmap() 檔案)分配的互斥、條件或訊號之間進行同步。"
按照上面的操作也是不支援的,必須需要核心的配合才行。
Linux系統多執行緒讀寫鎖
author eclipse email eclipsecs qq.com time sat may 9 16 57 24 cst 2020 include include include using namespace std pthread rwlock t rwlock const int r...
Linux系統程式設計 讀寫鎖rwlock
讀寫鎖是另一種實現執行緒間同步的方式。與互斥量類似,但讀寫鎖將操作分為讀 寫兩種方式,可以多個執行緒同時占用讀模式的讀寫鎖,這樣使得讀寫鎖具有更高的並行性。讀寫鎖的特性為 寫獨佔,讀共享 寫鎖優先順序高。對於讀寫鎖,掌握了這12個字就足矣了。linux環境下,讀寫鎖具有以下三種狀態 讀模式下加鎖狀態...
Linux系統程式設計 讀寫鎖rwlock
讀寫鎖是另一種實現執行緒間同步的方式。與互斥量類似,但讀寫鎖將操作分為讀 寫兩種方式,可以多個執行緒同時占用讀模式的讀寫鎖,這樣使得讀寫鎖具有更高的並行性。讀寫鎖的特性為 寫獨佔,讀共享 寫鎖優先順序高。對於讀寫鎖,掌握了這12個字就足矣了。linux環境下,讀寫鎖具有以下三種狀態 1.讀模式下加鎖...