Asked about 7 hours ago 4 0 0
  • 4 0 0
0

Cho mình hỏi về C# thread safe

Share
  • 4 0 0

Mình có search gg, thì có bảo rằng dùng câu lệnh: Parallel.ForEach vẫn không đảm bảo được thread safe nếu nhiều thread cùng đọc / ghi 1 data toàn cục. Và vậy mình thử làm 1 ví dụ như sau:

class A
{
    public int a { get; set; } = 2;
    
    public int Method(int input)
    {
        a += 2; // ghi - tăng giá trị của property a
        return input + 2;
    }
}

static void Main(string[] args)
{
    var singetonObj = new A(); // obj toàn cục
    var listThread = new List<int> { 6, 2, 8, 3, 7 }; // các thread
    var listResult = new List<int>();
    
    Parallel.ForEach(lstThread, t =>
    {
        lstResult.Add(singetonObj.Method(singetonObj.a + t)); // đọc - lấy giá trị của property a
    });
}

Nếu theo như trên mạng nói, thì việc đọc / ghi biến a như vậy sẽ dẫn đến văng exception về thread safe, nhưng không. Kết quả là vẫn chạy bình thường, và giá trị cuối cùng của biến a == 12. Kể cả mình đổi property của a là static luôn vẫn chạy bình thường, và kết quả a == 12. Vậy tóm lại Parallel.ForEach có thread safe hay ko ?

Viblo
Let's register a Viblo Account to get more interesting posts.