2011-11-24 62 views
1

我有一個函數一些代碼,是這樣的:我應該讓我的MutexLock變得不穩定嗎?

void foo() { 
    { // scope the locker 
     MutexLocker locker(&mutex); 
     // do some stuff.. 
    } 
    bar(); 
} 

函數調用bar()也鎖定了互斥。

我遇到了一個程序崩潰的問題(對於尚未提供堆棧跟蹤或更多細節的其他人),除非bar內部的互斥鎖被禁用。

是否有可能一些優化搞亂了我的範圍locker實例的範圍,如果是的話,會使互斥鎖volatile修復它?這是一個壞主意嗎?

謝謝。

+0

做酒吧和富使用相同的互斥?如果是這樣,你的互斥鎖支持重新鎖定? – Chang

+0

@Change - 爲什麼?爲什麼?我的意思是,如果它們是不同的互斥體,問題的重點是什麼?而重新鎖定只是在尋求麻煩。 – sje397

+0

我的意思是試圖獲得你已經在同一個線程中獲得的鎖。並非所有的互斥體實現都支持這種操作。volatile只是禁用編譯器優化訪問變量。 – Chang

回答

3

我不認爲有人可以真正回答這個問題,因爲我們(還有你)沒有看到堆棧回溯。

有沒有可能是一些優化亂搞

是的,它是,但它是非常,非常不可能。也許在超過99%的情況下,問題出現在代碼中,而不是優化中。

然而,可能編譯器優化「解鎖」的一些其他錯誤,最有可能的 - 未定義行爲,如果沒有優化,並與他們工作得很好 - 在UB變得崩潰 *

使它變得不穩定嗎?這是一個壞主意

我不認爲它會解決任何問題,我不認爲你需要volatile爲此。
我使用圍繞POSIX線程的包裝器class Mutexclass MutexLock,邏輯與您的情況相同,並且在這些類中沒有volatile(除了某些bool標誌和線程ID,但這似乎與案例無關)


「*」我最近有這樣的情況 - 當我們與-O2編譯的應用程序,奇怪的崩潰出現。我們調查了幾個月,我們找不到任何可疑的東西。然後刪除了優化,一切都開始正常工作了。
幾個月後,我發現這個問題,它似乎是多線程 - 在一個地方返回const ref,我們不應該這樣做。

+0

謝謝@Kiril。那裏有一些食物。 – sje397

+0

@ sje397 - 不客氣:)我知道這並沒有多大幫助,也沒有回答這個問題,但它可能會給你一些想法。你可以發佈堆棧跟蹤,一旦可用,它可能會給我們更多的信息。祝你好運。 –

3

據我所知,對互斥鎖的操作引入了隱式內存限制,因此聲明它不是必須的。問題可能在其他地方。

相關問題