C#线程同步使用详解
什么是线程同步?
当多个线程同时访问共享资源时,可能会导致数据的不一致或错误。线程同步就是为了协调多个线程对共享资源的访问,以保证数据的准确性和一致性。
C#中的线程同步方式
C#中有以下几种线程同步方式:
-
互斥量(Mutex)
在任意时刻,只有一个线程能占用互斥量所代表的共享资源。其他线程则需要等待,直到当前线程释放互斥量。 -
信号量(Semaphore)
信号量限制了可以访问共享资源的线程数量。当线程需要访问共享资源时,需先获取信号量。信号量的值大于0时,表示有可用的资源;而信号量的值为0时,表示所有资源都已被占用,线程需要等待。 -
事件(Event)
事件用于线程间的同步。一个线程通过事件触发另一个线程的执行。事件分为两种:手动重置事件和自动重置事件。 -
互斥锁(MutexLock)
互斥锁与Mutex的使用方式相同,用于保护共享资源的访问。
示例1:使用Mutex实现线程同步
using System.Threading;
public class Program
{
private static Mutex mutex = new Mutex();
static void Main(string[] args)
{
Thread thread1 = new Thread(ThreadJob);
Thread thread2 = new Thread(ThreadJob);
thread1.Start();
thread2.Start();
thread1.Join();
thread2.Join();
Console.ReadKey();
}
static void ThreadJob()
{
mutex.WaitOne();
Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "进入");
Thread.Sleep(2000);
Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "离开");
mutex.ReleaseMutex();
}
}
输出:
线程3进入
线程3离开
线程4进入
线程4离开
在这个示例中,我们使用Mutex对共享资源进行锁定。在进入关键代码段前,线程需要等待锁定的资源被释放。当线程完成任务后,需要释放占用的锁定资源,以允许其他线程访问。
示例2:使用Semaphore实现线程同步
using System.Threading;
public class Program
{
private static Semaphore semaphore = new Semaphore(2, 3);
static void Main(string[] args)
{
Thread[] threads = new Thread[6];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(ThreadJob);
}
foreach (Thread thread in threads)
{
thread.Start();
}
foreach (Thread thread in threads)
{
thread.Join();
}
Console.ReadKey();
}
static void ThreadJob()
{
semaphore.WaitOne();
Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "进入");
Thread.Sleep(2000);
Console.WriteLine("线程" + Thread.CurrentThread.ManagedThreadId + "离开");
semaphore.Release();
}
}
输出:
线程3进入
线程4进入
线程3离开
线程4离开
线程5进入
线程5离开
线程6进入
线程6离开
在这个示例中,我们使用Semaphore限制了同时访问共享资源的线程数量。当信号量的值大于0时,线程可以访问共享资源;否则,线程需要等待。当线程完成任务后,需要释放信号量,以允许其他线程访问共享资源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#线程同步使用详解示例 - Python技术站