簡體   English   中英

代碼拋出 Object 同步方法是從未同步的代碼塊中調用的

[英]code throws Object synchronization method was called from an unsynchronized block of code

我正在編寫非常簡單的同步代碼,但我真的陷入了這個錯誤。 什么可能導致錯誤?

程序在 PulseAll(processingText) 的最后一行拋出錯誤

更新:在我的監控 class 中還有其他 function 由主線程 ProcessingText() 調用,它會導致問題嗎?

public void doWork(int threadTaskNumber)
        {
            while (!(bool)WorkDone)
            {
                lock (processingText)
                {
                    while (vowelCounter != 3 && threadTaskNumber != 0)
                    {
                        Monitor.Wait(processingText);
                    }

                    if (!(bool)workDone)
                    {

                        switch (threadTaskNumber)
                        {

                            case 0:
                                processingText += 'A';

                                if (vowelCounter != 3)
                                    vowelCounter++;
                                break;
                            case 1:
                                processingText += 'B';
                                break;
                            case 2:
                                processingText += 'C';
                                break;
                        }

                        if (++threadCounter == 15)
                            WorkDone = true;
                    }

                    Monitor.PulseAll(processingText);
                }
            }
        }

public void ProcessingText()
        {
            lock (processingText)
            {
                Console.WriteLine(processingText);
            }
        }

拋出SynchronizationLockException是因為在這兩行之間:

Monitor.Wait(processingText);
//...
Monitor.PulseAll(processingText);

...變量processingText的值已更改。 因此Monitor.PulseAll嘗試使用當前線程不擁有的鎖發送脈沖,因此您觀察到異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM