經過我的任務調度程序的某個階段的測試後,我幾乎隨機地遇到了一個死鎖。我想問一些幫助,特別是我想知道我的方法是否會陷入僵局,或者如果問題在別處。
開始之前我會說應用程序是一個全屏遊戲。 (以防它可能會影響任何東西)
我會用文字解釋系統是如何工作的。死鎖,一些問題
任務調度
1)的附表2每個CPU的任務在每一個幀的開始。 (通過調度我的意思是設置任務的私人WaitHandle設置允許任務做一些工作)
下面是一個簡短的代碼,總結系統正在做的兩個任務中的每一個。
Scheduled++;
InternalLock.Reset();
在完成這兩項任務之後,他們通過設置Private WaitHandle開始。
2)等待所有任務完成。等待是通過等待內部WaitHandle來完成的,每個任務都必須發送信號。 (WaitOne的()上的每個任務)
這裏是等待的代碼:
if (Attese.Length > 0)
{
TmpIsSucceded = false;
for (int i = 0; i < Attese.Length; i++)
{
WaitHandle actual = Attese[i].Wait;
do
{
TmpIsSucceded = actual.WaitOne(150);
if (!TmpIsSucceded)
EnginesManager.ProcessMessages();
} while (!TmpIsSucceded);
}
}
任務
1)永遠不會關閉,直到比賽結束。
2)有2個內部WaitHandle。一位私人人員在他爲他工作時講述任務。當任務結束其工作時,一個內部信號發出。 (任務調度程序正在等待的那個)
3)當任務完成時,自己啓動任務調度程序的synchronized(by lock())隊列中可用的另一個任務(同樣通過設置私有waithandle該任務)。
這是任務的主循環:
private void CoreThread()
{
while (_active)
{
PrivateLock.WaitOne(-1, false);
while (Scheduled > 0)
{
if (OnThreadExecute != null)
OnThreadExecute(this, null);
Scheduled--;
if (Scheduled == 0)
{
PrivateLock.Reset();
if (OnThreadEnd != null)
OnThreadEnd(this, null);
InternalLock.Set();
}
}
}
}
InternalLock和PrivateLock是兩個waitHandles。請注意,InternalLock等待句柄僅在此代碼中設置。沒有其他地方設置InternalLock或PrivateLock。 (我發佈的代碼除外)
當發生死鎖時,任務調度程序正在等待所有要完成的任務,但其中一個任務從未設置InternalLock等待句柄。 「已阻止」任務在「PrivateLock.WaitOne(-1,false)」停止;當發生死鎖時。
任何人都有關於這種僵局的線索?
編輯:
internal void StartSchedule()
{
for (int i = 0; i < Tasks.Length; i++)
{
if (Tasks[i].Schedule())
QTasks.Enqueue(Tasks[i]);
}
StartThreadAvailable();
}
private void StartThreadAvailable()
{
TempExecList.Clear();
for (int i = 0; i < NThread; i++)
{
if (QTasks.Count > 0)
TempExecList.Add(QTasks.Dequeue());
}
Int32 count = TempExecList.Count;
for (int i = 0; i < count; i++)
TempExecList[i].StartThread();
}
internal void StartThread()
{
PrivateLock.Set();
}
這裏的地方專用手柄的設置()的要求被調用的代碼。
Schedule()在這種情況下總是返回true。(只加1的任務調度變量和重置InternalLock)
編輯2:
這裏的2類爲問代碼:
http://pastebin.com/m225f839e(GameTask)
http://pastebin.com/m389629cd(TaskScheduler)
請出示包含'PrivateLock的代碼。Set()' –
添加了代碼 – feal87
您是如何聲明等待句柄的?你能發佈一個完整的編譯樣本嗎? –