天天看點

Mutex對象使用時發現的問題

大家好,又見面了,我是你們的朋友全棧君。

Mutex對象等待互斥對象的方法有:Mutex.WaitAll、WaitOne、Mutex.WaitAny

使用Mutex對象經常出現的異常現象有:

異常一、 由于出現被放棄的 mutex,等待過程結束

原因:擷取互斥對象後沒有顯式的釋放對應的互斥對象就結束了對應的線程

解決辦法:每調用一個等待方法,在結束調用時都要調用ReleaseMutex()方法進行Mutex對象釋放。而每種釋放的方法方式也有點差別。如:

(1)、WaitOne()

Mutex gM1=new Mutex();

gM1.WaitOne();//等待gM1的釋放

gM1的釋放為:

gM1.ReleaseMutex();

(2)、WaitAll()

Mutex[] gMs = new Mutex[2];

gMs[0] = gM1;

gMs[1] = gM2;

Mutex.WaitAll(gMs); //等待gM1和gM2的釋放

for (int i = 0; i < gMs.Length; i++)

{

gMs[0].ReleaseMutex();

}

(3)、WaitAny()

Mutex[] gMs = new Mutex[2];

gMs[0] = gM1;

gMs[1] = gM2;

int index = Mutex.WaitAny(gMs); //等待數組中任意一個Mutex對象被釋放

gMs[index].ReleaseMutex();

異常二、 從不同步的代碼塊中調用了對象同步方法。

此問題是在調用 WaitAny()方法後調用多個釋放對象導緻的。如:

Mutex[] gMs = new Mutex[2];

gMs[0] = gM1;

gMs[1] = gM2;

Mutex.WaitAny(gMs);

gM1.ReleaseMutex();

gM2.ReleaseMutex();

正确的寫法如:

Mutex[] gMs = new Mutex[2];

gMs[0] = gM1;

gMs[1] = gM2;

int index = Mutex.WaitAny(gMs); //等待數組中任意一個Mutex對象被釋放

gMs[index].ReleaseMutex();

總結:調用Mutex對象的等待與釋放方法要成對出現,調用哪個就要釋放哪個。

寫的有點俗,請見諒哈

釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/153203.html原文連結:https://javaforall.cn