Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Thread Synchronization ใน C#: lock และ Mutex

ภาพรวม

Thread synchronization ใช้ป้องกัน race condition เมื่อหลายเธรดเข้าถึงทรัพยากรร่วมกัน เครื่องมือหลักคือ lock (monitor) และ Mutex

1. lock Statement (Monitor) - ใช้ภายใน Process เดียว


public class Demo {
    private readonly object _lock = new object(); // ต้องเป็น reference type

    public void Process() {
        lock (_lock) {
            // Critical section - รันได้เพียงเธรดเดียวในเวลาเดียวกัน
        }
    }
}

คุณสมบัติ

  • Syntax sugar ของ Monitor.Enter/Exit
  • Reentrant: เธรดเดียวกันสามารถ lock ซ้ำได้
  • ทำงานได้เฉพาะภายใน process เดียว
  • ประสิทธิภาพดีกว่า Mutex

2. Mutex - ใช้ข้าม Process ได้ (Interprocess)


using System;
using System.Threading;

public class Demo {
    private static Mutex _mutex = new Mutex(false, "Global\\MyAppMutex");

    public static void Main() {
        Console.WriteLine("Waiting for the Mutex...");
        _mutex.WaitOne(); // บล็อกจนได้ lock

        Console.WriteLine("Owned the mutex. Press ENTER to release.");
        Console.ReadLine();

        _mutex.ReleaseMutex();
    }
}

คุณสมบัติ

  • ทำงานข้าม process ได้ (named mutex)
  • Non-reentrant โดยค่าเริ่มต้น (แต่สร้างด้วย constructor ที่ระบุได้)
  • ช้ากว่า lock
  • ใช้สำหรับ single-instance application

ตัวอย่างป้องกัน Single Instance App


static Mutex _mutex = new Mutex(true, "MyUniqueAppName", out bool createdNew);

if (!createdNew) {
    Console.WriteLine("Application already running.");
    return;
}

try {
    // Run application
}
finally {
    _mutex.ReleaseMutex();
}

เปรียบเทียบ

คุณสมบัติlockMutex
ขอบเขตProcess เดียวข้าม Process
ประสิทธิภาพเร็วช้ากว่า
Reentrantใช่ไม่ (โดยค่าเริ่มต้น)
Namedไม่ได้