Tôi gặp khó khăn khi hiểu tại sao đa luồng không cập nhật được giá trị trước khi chuỗi hoàn tất. Chuỗi riêng có bản sao tham chiếu hoặc giá trị riêng không?
Vấn đề đa luồng cập nhật giá trị
Nếu không, để hiểu biết của tôi mã dưới đây sẽ hoạt động đúng khi MyMethod được gọi, nhưng thường nó không tạo ra các trường hợp của một số đối tượng MyType trong mảng trước khi thread.IsAlive
trở thành sai:
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
}
}
Điểm tốt. Nếu câu lệnh đầu tiên trong 'FillObjects()' là 'Thread.Sleep (1000)' có lẽ chỉ 'obj [Environment.ProcessorCount - 1]' sẽ không null vì vòng lặp sẽ tăng lên 'i' đến giá trị cuối của nó. trước khi đối tượng đầu tiên được tạo. Suy nghĩ về nó, FillObjects() có thể ném bởi vì 'i' thực sự được tăng lên đến' Environment.ProcessorCount-1' trước khi thoát khỏi vòng lặp và do đó nằm ngoài giới hạn của 'obj'. –
Cảm ơn bạn đã trả lời, thực sự đó là một trong những vấn đề lớn, bây giờ nó instantiates các đối tượng đúng cách. Tuy nhiên, thread không hoàn thành tất cả các hoạt động đúng trước khi nó tắt và thực hiện điều này một cách ngẫu nhiên. Bất kỳ đề xuất? – Almis
Tôi đã tìm thấy sai lầm hợp lý của riêng mình, bây giờ nó hoạt động đúng. – Almis