pthread_rwlock使用錯(cuò)誤
寫(xiě)鎖之后讀鎖竟然沒(méi)有阻塞, 順利運(yùn)行下去了.
據(jù)常理,寫(xiě)鎖之后,試圖讀加鎖時(shí)會(huì)阻塞.
代碼如:
pthread_rwlock_t rwl;
cout << "init: " << pthread_rwlock_init(&rwl, NULL) << endl;
cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl;
cout << "rdlock: " << pthread_rwlock_rdlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl; // DEAD!
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
輸出為:
init: 0
wrlock: 0
rdlock: 35
unlock: 0
unlock: 0
程序會(huì)死鎖在接下來(lái)的寫(xiě)鎖定上. 35錯(cuò)誤號(hào)為EDEADLK, 意為出現(xiàn)死鎖.
仔細(xì)研究pthread讀寫(xiě)鎖的文檔, 才發(fā)現(xiàn)原來(lái)如果一個(gè)線程寫(xiě)鎖定后,
又調(diào)用pthread_rwlock_rdlock函數(shù)來(lái)讀鎖定,結(jié)果將無(wú)法預(yù)測(cè)。
Results are undefined if the calling thread currently owns a write lock on rwlock.
但是pthread_rwlock_rdlock()的man文檔卻對(duì)此沒(méi)有明確指出.
參考:
讀寫(xiě)鎖 ( http://www.duangw.net/computer/history/pthread/rwlock.html )
pthread_rwlock_rdlock(3T) ( http://docs.hp.com/en/B2355-60103/pthread_rwlock_rdlock.3T.html )
不管怎樣, pthread_rwlock_rdlock()都應(yīng)該判斷返回值,
因?yàn)橛锌赡芡瑫r(shí)讀太多會(huì)返回EAGAIN.
這樣pthread_rwlock使用起來(lái)就麻煩許多.
查看了boost::thread, 它好像就沒(méi)用pthread的讀寫(xiě)鎖.
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)
寫(xiě)鎖之后讀鎖竟然沒(méi)有阻塞, 順利運(yùn)行下去了.
據(jù)常理,寫(xiě)鎖之后,試圖讀加鎖時(shí)會(huì)阻塞.
代碼如:
pthread_rwlock_t rwl;
cout << "init: " << pthread_rwlock_init(&rwl, NULL) << endl;
cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl;
cout << "rdlock: " << pthread_rwlock_rdlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
cout << "wrlock: " << pthread_rwlock_wrlock(&rwl) << endl; // DEAD!
cout << "unlock: " << pthread_rwlock_unlock(&rwl) << endl;
輸出為:
init: 0
wrlock: 0
rdlock: 35
unlock: 0
unlock: 0
程序會(huì)死鎖在接下來(lái)的寫(xiě)鎖定上. 35錯(cuò)誤號(hào)為EDEADLK, 意為出現(xiàn)死鎖.
仔細(xì)研究pthread讀寫(xiě)鎖的文檔, 才發(fā)現(xiàn)原來(lái)如果一個(gè)線程寫(xiě)鎖定后,
又調(diào)用pthread_rwlock_rdlock函數(shù)來(lái)讀鎖定,結(jié)果將無(wú)法預(yù)測(cè)。
Results are undefined if the calling thread currently owns a write lock on rwlock.
但是pthread_rwlock_rdlock()的man文檔卻對(duì)此沒(méi)有明確指出.
參考:
讀寫(xiě)鎖 ( http://www.duangw.net/computer/history/pthread/rwlock.html )
pthread_rwlock_rdlock(3T) ( http://docs.hp.com/en/B2355-60103/pthread_rwlock_rdlock.3T.html )
不管怎樣, pthread_rwlock_rdlock()都應(yīng)該判斷返回值,
因?yàn)橛锌赡芡瑫r(shí)讀太多會(huì)返回EAGAIN.
這樣pthread_rwlock使用起來(lái)就麻煩許多.
查看了boost::thread, 它好像就沒(méi)用pthread的讀寫(xiě)鎖.
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)