none
lock 鎖死 RRS feed

  • 問題

  • class TestObj { public object LockObj = new object(); void ThreadFunction(object obj) { while(true) { lock(LockObj ) { action A } action B lock(LockObj ) { action C } } } }


    public partial class Form1 :Fomr

    {

    TestObj test = new TestObj();

    private void button2_Click(object sender, EventArgs e)

    {

    lock(test.LockObj)

    {

    }

    }

    }

    Q1.大致的狀況是我有一物件有一個lock物件 並且有一個function於背景執行緒一直執行且會使用到lock物件,並且當UI按鈕點擊時也會使用到lock,有時候點擊按鈕時卻會莫名鎖死,後續建置一個相同使用lock架構的測試專案卻都測不出來

    • 已編輯 StuBoo 2019年5月13日 上午 02:48
    2019年5月9日 上午 04:35

解答

  • 用 this.BeginInvoke 試試看。

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2019年5月23日 上午 06:12
    2019年5月13日 上午 05:27
    版主

所有回覆

  • 除非是刻意寫 dead lock,否則 dead lock 本來就是一個很難偵測的問題。

    只能詳細查看程式碼是不是有可能發生兩條 thread 互相等待。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年5月9日 上午 10:02
    版主
  • 除非是刻意寫 dead lock,否則 dead lock 本來就是一個很難偵測的問題。

    只能詳細查看程式碼是不是有可能發生兩條 thread 互相等待。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    後續檢查到Action A 裡面會觸發Event,會執行Form的function X,因為會編輯UI、不同執行緒所以function X有使用this.invoke

    貌似剛好視窗的執行緒Click再等待lock,然後後續又剛好執行到function X內的this.invoke讓視窗執行緒操作,但視窗執行緒正在等待lock而導致程序卡住




    • 已編輯 StuBoo 2019年5月13日 上午 03:34
    2019年5月13日 上午 03:06
  • 用 this.BeginInvoke 試試看。

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    • 已標示為解答 StuBoo 2019年5月23日 上午 06:12
    2019年5月13日 上午 05:27
    版主