Kodumda hatalı bir hata var. Son derece nadirdir (her birkaç haftada bir olabilir), ama orada ve neden olduğundan emin değilim.Çok iş parçacıklı .NET sıra sorunları
Biz 2 iş parçacığı çalışan var, 1 diş ağ iletileri alır ve böyle bir Queue'ya ekler:
while (NetworkingClient.DataMessages.Count > 0)
{
DataMessage message = NetworkingClient.DataMessages.Dequeue();
switch (message.messageType)
{
...
}
}
:
DataMessages.Enqueue(new DataMessage(client, msg));
başka iplik böyle, bu sıraya kapalı mesajlar alır ve bunları kolları
Ancak her seferinde sık sık switch (message.messageType)
numaralı hat üzerinde bir NullReferenceException alıyorum ve hata ayıklayıcısında mesajın boş olduğunu görebiliyorum.
Sıfır değerinin sıraya konması mümkün değildir (kodun ilk bitine bakın) ve bunlar kuyruğu kullanan yalnızca 2 şeydir.
Queue iş parçacığı için güvenli değil, diğer iş parçacığının tam olarak anıya geçtiğini ve bu da aksamaya neden olabileceğimi düşünüyor olabilir mi?
.NET BCL'deki çok az şey bu şekilde iş parçacığı için güvenlidir. Bu durumda, "Kuyruk iş parçacığı güvenliğini sağlamak için, tüm işlemler [Senkronize] tarafından döndürülen sargı aracılığıyla gerçekleştirilmelidir (http://msdn.microsoft.com/en-us/library/system.collections.queue .aspx) yöntemi. Sorununuz, eğer varsa, iki iş parçacığının aynı anda çoğaltılması veya deforme edilmesi olabilir. Her iki şekilde de, iplik güvenliği sizin sorumluluğunuzdadır. – bzlm
+1, İyi soru, gerçekten bir yarış durumu ve onun sonucu (bozuk/kararsız/beklenmedik durum) gösterir. –
Kodunuzun görünümü ile, iş parçacıklarınız için sadece bir saf döngü yapıyorsunuz gibi görünüyor. Bunu senkronize etmek için uygun bir [sınırlanmış arabellek] (http://en.wikipedia.org/wiki/Producer-consumer_problem) uygulanmasına dikkat etmelisiniz. –