PC問題中wait使用if還是while修飾

2021-08-18 06:15:17 字數 608 閱讀 5113

情景:多執行緒中生產者消費者問題中對臨界區(critical section)資源有等待的過程,會呼叫wait()方法等待其他執行緒釋放鎖的過程,使用while修飾,而不是使用if來修飾

如:

while (queue.peek() == null) 

queue.remove();

//而不是使用if

if (queue.peek() == null)

queue.remove();

具體原因:

首先當呼叫wait()方法後,當前執行緒獲取了監視器後就會釋放鎖,讓出cpu時間,當被喚醒的時候是從wait()方法之後執行的。如果使用if修飾,所有執行緒(執行緒數大於2)都會這裡已經走出if**塊,如果此時queue中size等於1,那麼就會丟擲異常。而使用while修飾時,從wait下面繼續執行,還會執行while的條件,進而保證queue中size大於1的情況下才能進行queue.remove()的操作

高精度計算問題中使用double失敗的原因

在比賽中經常可能接觸到高精度計算的問題,高精度演算法雖然不難,但是寫起來總是比直接用麻煩,於是我當時想了各種方法偷懶,想避免這個問題,當時最先想到的就是利用浮點型float 和double的高精度特性來代替高精度演算法。具體做法是先用乙個double型變數ans來計算並表示結果,然後把結果輸出時只顯...

分類問題中的樣本不均衡演算法使用備忘錄

1.使用代價函式時,可以增加小雷樣本的權重,降低打雷樣本的權重 這種方法其實是產生了新的資料分布,即產生了新的資料集 從而使得分類器將重點集中在小類樣本身上。剛開始,可以設定每個類別的全職與樣本個數比例的倒數,然後使用過取樣進行調優。2.可以把小類樣本作為異常點 outliers 把問題轉化成一場檢...

使用PROC編譯 pc檔案成 c後遇到的問題

使用 gcc test.c lclntsh 編譯 報錯 usr bin ld cannot find lclntsh collect2 ld 返回 1 使用 gcc test.c l oracle home lib lclntsh 編譯成功生成a.out檔案 因為在配置.bash profile時已...