我很難理解爲什麼多線程失敗線程完成之前更新值。單獨的線程是否有自己的引用或值的副本?
多線程問題,更新的價值
如果不是這樣,我的理解下面的代碼應能正常工作時的MyMethod被調用,但通常不會在thread.IsAlive
之前創建數組中的一些的MyType對象的實例爲假:
class MyClass
{
static MyType[] obj = new MyType[Environment.ProcessorCount - 1];
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
threads[i] = new Thread(() => FillObjects(i));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads[i].Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
void FillObjects(int i)
{
obj[i] = new MyType();
//perform actions with obj[i] to fill it with necessary values
}
}
好點。如果'FillObjects()'中的第一個語句是'Thread.Sleep(1000)',可能只有'obj [Environment.ProcessorCount - 1]'是非空的,因爲循環會將'i'增加到它的最終值在創建第一個對象之前。考慮一下,FillObjects()可能會拋出,因爲在循環退出之前'i'實際上會增加到'Environment.ProcessorCount-1',因此超出了'obj'的範圍。 –
感謝您的回覆,確實這是主要問題之一,現在它正確地實例化對象。然而,線程在關閉之前並未完全正確地完成所有操作,而是隨機執行此操作。有什麼建議麼? – Almis
我發現自己的邏輯錯誤,現在它正常工作。 – Almis