Tôi có thể thiếu một số thứ cơ bản ở đây, nhưng vẫn sẽ đánh giá cao sự giúp đỡ của các bạn trong việc hiểu điều này. Vì vậy, tôi có các chương trình đa luồng đơn giản sau đây tôi đã viết:Đơn giản C# đồng thời/đa luồng
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
// List<int> outcome = new List<int>();
Test t = new Test();
Thread thread1 = new Thread(new ThreadStart(t.call1));
Thread thread2 = new Thread(new ThreadStart(t.call2));
thread1.Start();
thread2.Start();
Thread.Sleep(3000); //Give enough time for threads to end
Console.Write("{0},", t.mSum);
t.mSum = 0;
}
}
class Test
{
public int mSum = 0;
public void call1()
{
//lock (this)
//{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Hello Thread 1, mSum value: {0}", mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 1, mSum value: {0}", mSum);
}
//}
// Console.WriteLine(mSum);
}
public void call2()
{
for (int i = 0; i < 100 ; i++)
{
Console.WriteLine("Hello Thread 2, mSum value: {0}",mSum);
mSum = mSum + 1;
Console.WriteLine("Goodbye Thread 2, mSum value: {0}",mSum);
}
}
}
}
Vì vậy, tôi mong chờ kết quả này là nondetermenistic vì bối cảnh chuyển đổi có thể xảy ra bất cứ lúc nào phải không? Nhưng khi tôi chạy chương trình, tôi nhận được đầu ra sau (chỉ là một phần của đầu ra, bị thay đổi do kỹ năng stackoverflow.com câu hỏi gửi bài nghèo của tôi):
Hello Thread 1, mSum value: 62 Goodbye Thread 1, mSum value: 63 Hello Thread 1, mSum value: 63 Goodbye Thread 1, mSum value: 64 Hello Thread 2, mSum value: 59 Goodbye Thread 2, mSum value: 65 Hello Thread 2, mSum value: 65 Goodbye Thread 2, mSum value: 66
Vì vậy, giả sử tôi viết điều này đúng, và mSum thực sự được chia sẻ giữa các chủ đề (trông giống như nó ...) - làm thế nào tôi có thể giải thích dòng không. 3? Chủ đề 2 đọc 59, thêm 1 và sau đó chúng tôi nhận được 65!
Tôi có khám phá ra một loại toán học mới không? :)
Và đây là thứ tự đúng mà không cần tái cơ cấu? Mã cho thấy rằng phải có một ngắt dòng giữa dòng "Hello" và dòng "Tạm biệt" và nếu bạn xóa nó là tốt, tôi chỉ cố gắng để có được một cảm giác để đảm bảo rằng nó đã đi "Xin chào 1, tạm biệt 1 ... xin chào 2, tạm biệt 2 "Nếu bạn biết tôi nói gì" –
Có thứ tự đúng: từ trái qua phải, sau đó lên đến dưới (62-> 63,63-> 64,59-> 65, 65-> 66) Tôi cố gắng thêm một hình ảnh vào đây nhưng không thể – Tal