ภาพรวม
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();
}
เปรียบเทียบ
| คุณสมบัติ | lock | Mutex |
|---|---|---|
| ขอบเขต | Process เดียว | ข้าม Process |
| ประสิทธิภาพ | เร็ว | ช้ากว่า |
| Reentrant | ใช่ | ไม่ (โดยค่าเริ่มต้น) |
| Named | ไม่ | ได้ |