亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4597 | 回復(fù): 9
打印 上一主題 下一主題

[函數(shù)] 解鎖函數(shù)pthread_mutex_unlock什么情況會失敗返回? [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2013-10-30 15:43 |只看該作者 |倒序瀏覽
在開發(fā)的項目中遇到一個非常怪異的問題,服務(wù)端運行好幾天處理了大量的業(yè)務(wù),表現(xiàn)算穩(wěn)定。但是今天凌晨出現(xiàn)了不響應(yīng)的情況,分析日志發(fā)現(xiàn)是死鎖了。 可以確定的是這種死鎖不是邏輯上的錯誤導致的死鎖。

在鎖的使用上我本著鎖定盡可能少的代碼的原則,所以加鎖和解鎖之間都是執(zhí)行了少量的代碼(里面也不會有嵌套的函數(shù))。可以說pthread_mutex_lock和pthread_mutex_unlock是成對出現(xiàn)的。所以我可以確定沒有邏輯上的死鎖問題。

唯一的瑕疵是,我調(diào)用pthread_mutex_lock和pthread_mutex_unlock沒有判斷返回值。加鎖pthread_mutex_lock是不需要判斷返回值的,因為它阻塞直到可以鎖定為止,一般不會有失敗的情況。按理說,既然加鎖成功了,那執(zhí)行玩代碼后接著解鎖也一定能成功,所以解鎖也無需判斷返回值吧?
并且我認為對加鎖解鎖判斷返回值是沒什么意義的,即使返回了錯誤,那你又該如何處理?難道就放棄執(zhí)行后面的代碼了嗎?

我項目中的這個死鎖問題很可能是pthread_mutex_unlock調(diào)用失敗了,導致下次加鎖時死鎖了。不知道大家是否遇到過這樣的情況,如果遇到了又是如何處理的呢?

論壇徽章:
5
雙魚座
日期:2013-11-26 17:56:26獅子座
日期:2013-11-29 15:41:32處女座
日期:2014-02-21 11:59:07技術(shù)圖書徽章
日期:2014-03-06 15:33:53技術(shù)圖書徽章
日期:2014-03-06 15:39:30
2 [報告]
發(fā)表于 2013-10-30 16:50 |只看該作者
吧mutex的屬性從PTHREAD_MUTEX_NORMAL改成PTHREAD_MUTEX_ERRORCHECK試試,然后做個判斷檢查,一旦已經(jīng)鎖住返回err,就打印到Log里面去。PTHREAD_MUTEX_NORMAL當當前線程已經(jīng)有鎖了再鎖一次應(yīng)該就會被鎖住的,而PTHREAD_MUTEX_ERRORCHECK會直接返回error。

       If the mutex type is PTHREAD_MUTEX_NORMAL, deadlock detection shall not be provided. Attempting to relock the mutex  causes  deadlock.
       If a thread attempts to unlock a mutex that it has not locked or a mutex which is unlocked, undefined behavior results.

       If  the  mutex type is PTHREAD_MUTEX_ERRORCHECK, then error checking shall be provided. If a thread attempts to relock a mutex that it
       has already locked, an error shall be returned. If a thread attempts to unlock a mutex that it has not locked  or  a  mutex  which  is
       unlocked, an error shall be returned.

論壇徽章:
0
3 [報告]
發(fā)表于 2013-10-30 17:45 |只看該作者
回復(fù) 2# bottles


默認是PTHREAD _MUTEX_DEFAULT吧。 這種狀態(tài)如果還有加鎖,是在隊列里排隊的,解鎖了就會讓隊首的線程先加鎖。

論壇徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46處女座
日期:2013-10-24 14:25:01酉雞
日期:2014-04-07 11:54:15
4 [報告]
發(fā)表于 2013-10-30 18:43 |只看該作者
double lock? double unlock ? non-initial-mutex?

論壇徽章:
5
雙魚座
日期:2013-11-26 17:56:26獅子座
日期:2013-11-29 15:41:32處女座
日期:2014-02-21 11:59:07技術(shù)圖書徽章
日期:2014-03-06 15:33:53技術(shù)圖書徽章
日期:2014-03-06 15:39:30
5 [報告]
發(fā)表于 2013-10-30 21:50 |只看該作者
會不會由于某個線程響應(yīng)了cancel pthread的消息然后退出了,但是這個時候鎖還沒有解鎖,然后這個鎖就一直掛在那里了。

論壇徽章:
1
綜合交流區(qū)版塊每日發(fā)帖之星
日期:2015-10-14 06:20:00
6 [報告]
發(fā)表于 2013-10-31 12:25 |只看該作者
嗯  線程的東西向來難搞!    不過我認為你還是加上解鎖失敗檢查返回值的代碼,下次失敗了,能看到錯誤信息,即使
不能最終解決問題也是能有收獲的!

我還是認為能用多進程,盡量不要用多線程。這次找出問題了,下次換臺機器,換個Linux內(nèi)核版本,或者換到Solaris FreeBSD,出錯的概率很大。

論壇徽章:
0
7 [報告]
發(fā)表于 2013-11-01 11:16 |只看該作者
回復(fù) 6# fly3ds


   哎   用多進程的毛病就是通信問題,我這種需求太復(fù)雜,只能這樣設(shè)計。 主進程既有單獨傳遞給每個連接的數(shù)據(jù),也有廣播給每個連接的數(shù)據(jù),如果一個連接一個進程,那么要創(chuàng)建N個共享內(nèi)存/socket/pipe?  一個連接一個進程一般適用于跟父進程無額外的業(yè)務(wù)交流比較合適吧。

  所以選擇多線程是比較好的方法,只要自定義數(shù)據(jù)結(jié)構(gòu),所有的線程放在一個list里面進行輪詢就好了。這里要擔心的就是這個list有添加、刪除、讀取、修改時,都要鎖定。 我這個需要有較多個線程來競爭這把鎖,只是我也想不出更好的模式了。

論壇徽章:
0
8 [報告]
發(fā)表于 2013-11-01 11:21 |只看該作者
回復(fù) 6# fly3ds


    我這種需求的連接其實是雙向服務(wù)的,既要處理來自客戶端的指令(socket通信就OK了),還有響應(yīng)來自服務(wù)端其他模塊的觸發(fā)指令(這里我選擇了自己實現(xiàn)的緩沖隊列通信模式,而拋棄了進程選擇線程)。

論壇徽章:
0
9 [報告]
發(fā)表于 2013-11-01 11:23 |只看該作者
回復(fù) 5# bottles


    嗯,分析過這種情況,沒發(fā)現(xiàn)前面的指令有沒處理完就退出的,都有完成工作了。

論壇徽章:
0
10 [報告]
發(fā)表于 2013-11-01 11:27 |只看該作者
回復(fù) 4# linux_c_py_php


    不至于同一個線程內(nèi)重復(fù)鎖定,重復(fù)解鎖也不會(這種情況就像重復(fù)free一樣會引起崩潰)。 未初始化更不至于,倒是又可能其他變量越界,修改了互斥鎖的內(nèi)容(這種問題是我懷疑的,也是最麻煩的)。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP