在C#中,线程监控数据改变通常可以通过以下几种方式实现:
1、定义共享资源和锁对象:首先定义一个共享资源,例如一个整数变量或一个自定义的数据类实例,然后定义一个锁对象,通常是一个object
类型的变量。
2、在线程中使用锁:在需要访问共享资源的线程中,使用lock
语句来锁定共享资源,这样可以确保在同一时刻只有一个线程能够访问该资源,从而实现对数据改变的监控。
3、示例代码:
using System; using System.Threading; class Program { private static int sharedData = 0; private static readonly object lockObject = new object(); static void Main(string[] args) { Thread thread1 = new Thread(IncrementData); Thread thread2 = new Thread(ReadData); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } static void IncrementData() { for (int i = 0; i < 10; i++) { lock (lockObject) { sharedData++; Console.WriteLine("Thread 1: Incremented data to " + sharedData); } Thread.Sleep(100); } } static void ReadData() { for (int i = 0; i < 10; i++) { lock (lockObject) { Console.WriteLine("Thread 2: Read data as " + sharedData); } Thread.Sleep(100); } } }
在这个示例中,sharedData
是共享资源,lockObject
是锁对象。IncrementData
方法中的线程每次增加sharedData
的值,而ReadData
方法中的线程读取sharedData
的值,通过使用lock
语句,确保了在任一时刻只有一个线程能够访问sharedData
,从而避免了数据竞争问题。
1、进入临界区:使用Monitor.Enter
方法进入临界区,表示开始对共享资源的访问。
2、退出临界区:使用Monitor.Exit
方法退出临界区,表示结束对共享资源的访问,也可以使用Monitor.TryEnter
方法尝试进入临界区,如果无法立即进入,则不会阻塞当前线程。
3、示例代码:
using System; using System.Threading; class Program { private static int sharedData = 0; private static readonly object lockObject = new object(); static void Main(string[] args) { Thread thread1 = new Thread(IncrementData); Thread thread2 = new Thread(ReadData); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); } static void IncrementData() { for (int i = 0; i < 10; i++) { Monitor.Enter(lockObject); try { sharedData++; Console.WriteLine("Thread 1: Incremented data to " + sharedData); } finally { Monitor.Exit(lockObject); } Thread.Sleep(100); } } static void ReadData() { for (int i = 0; i < 10; i++) { Monitor.Enter(lockObject); try { Console.WriteLine("Thread 2: Read data as " + sharedData); } finally { Monitor.Exit(lockObject); } Thread.Sleep(100); } } }
在这个示例中,Monitor.Enter
和Monitor.Exit
方法用于控制对共享资源sharedData
的访问,与lock
语句相比,Monitor
提供了更多的灵活性,例如可以尝试进入临界区而不阻塞当前线程。
1、创建互斥量实例:使用Mutex
类创建一个互斥量实例,可以在构造函数中指定是否为初始锁定状态。
2、请求互斥量:在需要访问共享资源的线程中,使用WaitOne
方法请求互斥量,如果互斥量已经被其他线程持有,当前线程将被阻塞,直到互斥量可用。
3、释放互斥量:当线程完成对共享资源的访问后,使用ReleaseMutex
方法释放互斥量。
4、示例代码:
using System; using System.Threading; class Program { private static int sharedData = 0; private static Mutex mutex = new Mutex(); static void Main(string[] args) { Thread thread1 = new Thread(IncrementData); Thread thread2 = new Thread(ReadData); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); **}