C#中使用AutoResetEvent实现同步是一种常见的方式,AutoResetEvent是一个同步对象,它允许一个线程等待另一个线程去发出一个信号,当信号发出后,等待的线程就会恢复执行。
实现方式:
首先需要在代码中创建一个AutoResetEvent实例对象,该对象用于线程间的同步,然后在需要同步的线程中调用WaitOne方法让线程等待信号,当发出信号时,调用Set方法来通知线程信号已经发出,可以恢复执行。
代码示例1:使用AutoResetEvent实现生产消费模型
AutoResetEvent _event = new AutoResetEvent(false);
Queue<int> _queue = new Queue<int>();
const int MAX = 5;
const int PRODUCER_COUNT = 5;
const int CONSUMER_COUNT = 3;
void Producer()
{
int i = 0;
while (i < MAX)
{
lock (_queue) { _queue.Enqueue(i++); }
_event.Set();
Thread.Sleep(500);
}
}
void Consumer()
{
while (true)
{
_event.WaitOne();
int value = 0;
lock (_queue) { value = _queue.Dequeue(); }
Console.WriteLine("消费者 " + Thread.CurrentThread.ManagedThreadId + " 消费了 " + value);
}
}
代码示例2:使用AutoResetEvent实现读写锁方式
AutoResetEvent _readEvent = new AutoResetEvent(true);
AutoResetEvent _writeEvent = new AutoResetEvent(true);
int _readCount = 0;
int _value = 0;
void Read()
{
while (true)
{
_readEvent.WaitOne();
_readCount++;
if (_readCount == 1) { _writeEvent.WaitOne(); }
_readEvent.Set();
Console.WriteLine("读者 " + Thread.CurrentThread.ManagedThreadId + " 读取了 " + _value);
_readEvent.WaitOne();
_readCount--;
if (_readCount == 0) { _writeEvent.Set(); }
_readEvent.Set();
}
}
void Write()
{
while (true)
{
_writeEvent.WaitOne();
_value++;
Console.WriteLine("写者 " + Thread.CurrentThread.ManagedThreadId + " 写入了 " + _value);
_writeEvent.Set();
Thread.Sleep(1000);
}
}
上述代码示例1展示了使用AutoResetEvent实现生产消费模型的方式,代码实现了5个生产者和3个消费者之间的通信,生产者负责不断向队列中放入元素,消费者负责从队列中取出元素进行消费,生产者会不断生产出新的元素并立即通知消费者进行消费,而消费者则在接受到生产者的通知后立即从队列中取出元素进行消费,代码中的AutoResetEvent实例完成了生产者和消费者的同步。
代码示例2展示了使用AutoResetEvent实现一种读写锁的方式,多个读线程可以同时访问数据,但是在某一个写线程正在写入数据时,所有的读线程和其他写线程都将被锁定,此时只允许一个写线程进行写入处理。在代码的实现中,AutoResetEvent实例对象被分成了两个,分别用于读取和写入操作,通过这种方式可以避免同步操作互相冲突或者错误执行等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用AutoResetEvent实现同步 - Python技术站