ManualResetEvent
是 C# 中一種用于同步線程的類,它允許一個或多個線程等待某個條件成立。它可以與其他同步機制結合使用,例如 Mutex
、AutoResetEvent
和 SemaphoreSlim
等。下面是一些示例,展示了如何將 ManualResetEvent
與其他同步機制結合使用。
Mutex
使用:using System;
using System.Threading;
class Program
{
static Mutex mutex = new Mutex();
static ManualResetEvent resetEvent = new ManualResetEvent(false);
static void Main()
{
Thread t1 = new Thread(ThreadMethod1);
Thread t2 = new Thread(ThreadMethod2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
mutex.WaitOne(); // 獲取互斥鎖
Console.WriteLine("Thread 1 acquired the lock.");
resetEvent.Set(); // 設置手動重置事件
mutex.ReleaseMutex(); // 釋放互斥鎖
}
static void ThreadMethod2()
{
resetEvent.WaitOne(); // 等待手動重置事件
Console.WriteLine("Thread 2 acquired the event.");
mutex.WaitOne(); // 獲取互斥鎖
Console.WriteLine("Thread 2 acquired the lock.");
mutex.ReleaseMutex(); // 釋放互斥鎖
}
}
AutoResetEvent
使用:using System;
using System.Threading;
class Program
{
static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
static object lockObject = new object();
static void Main()
{
Thread t1 = new Thread(ThreadMethod1);
Thread t2 = new Thread(ThreadMethod2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
autoResetEvent.WaitOne(); // 等待自動重置事件
lock (lockObject)
{
Console.WriteLine("Thread 1 acquired the lock.");
}
autoResetEvent.Set(); // 設置自動重置事件
}
static void ThreadMethod2()
{
autoResetEvent.WaitOne(); // 等待自動重置事件
lock (lockObject)
{
Console.WriteLine("Thread 2 acquired the lock.");
}
autoResetEvent.Set(); // 設置自動重置事件
}
}
SemaphoreSlim
使用:using System;
using System.Threading;
class Program
{
static SemaphoreSlim semaphore = new SemaphoreSlim(1, 1);
static object lockObject = new object();
static void Main()
{
Thread t1 = new Thread(ThreadMethod1);
Thread t2 = new Thread(ThreadMethod2);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
}
static void ThreadMethod1()
{
semaphore.Wait(); // 等待信號量
lock (lockObject)
{
Console.WriteLine("Thread 1 acquired the lock.");
}
semaphore.Release(); // 釋放信號量
}
static void ThreadMethod2()
{
semaphore.Wait(); // 等待信號量
lock (lockObject)
{
Console.WriteLine("Thread 2 acquired the lock.");
}
semaphore.Release(); // 釋放信號量
}
}
這些示例展示了如何將 ManualResetEvent
與其他同步機制結合使用,以確保線程安全地訪問共享資源。在實際應用中,你可以根據需要選擇合適的同步機制。