美文网首页
C# 中生产者和消费者模型 (二)

C# 中生产者和消费者模型 (二)

作者: 土DOU吹雪 | 来源:发表于2018-04-23 19:31 被阅读0次

线程同步

在队列安全的基础上,使用生产者和消费者线程连续访问队列,若无元素需要写入(对生产者)或无元素需要读出(对消费者),则进程休眠,即可实现生产者和消费者模型。

//生产者
Queue queue_save;
if( 有元素需要写入 )
{
    lock (queue.SyncRoot)
    {
        queue.Enqueue(array);//push queue
    }
}
else
{
    Thread.Sleep(10);
}

但连续访问效率并不够高,使用进程间同步的方法能够提高程序效率。

进程间同步有多种方式,详见参考资料【1】,这里使用 EventWaitHandle ( AutoResetEvent、ManualResetEvent )方法举例。

EventWaitHandle.Set 和 EventWaitHandle.WaitOne 方法可以分别解除阻塞/阻塞一个进程。我们让消费者线程每次无法读取数据时(队列为空)阻塞,生产者向队列中写数据时解除消费者线程阻塞。

//生产者
Queue queue_save;
private static EventWaitHandle flag = new AutoResetEvent(false);
if( 有元素需要写入 )
{
    lock (queue.SyncRoot)
    {
        queue.Enqueue(array);//push queue
    }
    flag.Set();
}
else
{
    Thread.Sleep(10);
}

//消费者
if (queue.Count > 0)
{
    lock (queue.SyncRoot)
    {
        (queue.Dequeue()).CopyTo(array, 0);
    }
}
else
{
    flag.WaitOne();
}

线程停止

简单地说,使用经典的 Thread.Abort 方法停止线程是粗暴且不优雅的,调用 Abort 方法,程序员无法知道线程停止的具体位置和时间,详见参考资料【3】。

更好的方法是程序员自己在线程内为线程定义停止接口,利用 CancellationTokenSource 类,详见参考资料【2】。当 CancellationTokenSource 类中的 Cancel 方法被调用时, CancellationTokenSource.Token.IsCancellationRequested 的值置为true,线程检测该值并退出。

下面例子来自参考资料【3】

CancellationTokenSource cts =new CancellationTokenSource();
Thread t =new Thread(() =>
{
while (true)
{
if (cts.Token.IsCancellationRequested)
{
Console.WriteLine("线程被终止!");
break;
}
Console.WriteLine(DateTime.Now.ToString());
Thread.Sleep(1000);
}
});
t.Start();
Console.ReadLine();
cts.Cancel();

参考资料
1.http://www.cnblogs.com/luminji/archive/2011/05/03/2034890.html
2.https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(v=vs.110).aspx
3.http://www.cnblogs.com/luminji/archive/2011/05/03/2034890.html

相关文章

  • 生产者和消费者模型

    生产者和消费者模型 1. 什么是生产者和消费者模型 生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者...

  • 34.Python之生产者消费者模型

    Python之生产者消费者模型(非常重要) 生产者消费者模型模型指的是一种解决问题的套路。 生产者消费者模型中包含...

  • Linux生产者消费者模型与C/C++子线程调用Java

    生产者消费者模型 基于生产者和消费者的模型在编程中运用是较多。生产者是一个或者多个线程产生数据,消费者是另一个或者...

  • Future

    Future 模式只是生产者-消费者模型的扩展。经典“生产者-消费者”模型中消息的生产者不关心消费者何时处理完该条...

  • wait/notify实现生产者消费者(6)

    生产者消费者模型 生产者消费者模型是一个典型的多线程问题,涉及生产者、消费者、产品仓库。生产者生产的产品放入仓库中...

  • 生产者消费者(一)

    生产者消费者模型: 生产者------> 缓存<-------- 消费者

  • handler简单研究

    handler原理构成了线程模型中简单的生产者-消费者模型:生产者和消费者在同一时间段内共用同一个存储空间,生产者...

  • 4-RxJava源码分析之 --- 操作符

    RxJava是一个生产者和消费者模型,有生产者Observable和消费者Observer,对于简单的一个生产者和...

  • Android Handler详解(附面试题)

    可以将Handler模型理解为:生产者—消费者 模型。该模型中,生产者在子线程中生产Message,调用Handl...

  • python入门开发学习笔记之掌握什么是生产者消费者模型

    本节重点 熟练掌握什么是生产者消费者模型熟练掌握为什么要用生产者消费者模型熟练掌握如何实现生产者消费者模型本节时长...

网友评论

      本文标题:C# 中生产者和消费者模型 (二)

      本文链接:https://www.haomeiwen.com/subject/yxzllftx.html