`
bcyy
  • 浏览: 1823723 次
文章分类
社区版块
存档分类
最新评论

C#中Queue的线程安全问题

 
阅读更多

通过集合枚举在本质上不是一个线程安全的过程。甚至在对集合进行同步处理时,其他线程仍可以修改该集合,这会导致枚举数引发异常。若要在枚举过程中保证线程安全,可以在整个枚举过程中锁定集合,或者捕捉由于其他线程进行的更改而引发的异常。

下列示例说明如何同步 Queue、如何确定 Queue 是否同步以及如何使用同步的 Queue。Unity3D教程手册


using System;

  using System.Collections;

  public class SamplesQueue  {

  public static void Main()  {

  // Creates and initializes a new Queue.

  Queue myQ = new Queue();

  myQ.Enqueue( “The” );

  myQ.Enqueue( “quick” );

  myQ.Enqueue( “brown” );

  myQ.Enqueue( “fox” );

  // Creates a synchronized wrapper around the Queue.

  Queue mySyncdQ = Queue.Synchronized( myQ );

  // Displays the sychronization status of both Queues.

  Console.WriteLine( “myQ is {0}.”, myQ.IsSynchronized ? “synchronized” : “not synchronized” );

  Console.WriteLine( “mySyncdQ is {0}.”, mySyncdQ.IsSynchronized ? “synchronized” : “not synchronized” );

  }

  }


通过对比运行结果,可以明显的看出通过Queue.Synchronized方法包装的Queue被同步,没有包装的则没有被同步。可以在实例化处这样声明,


 // Creates a synchronized wrapper around the Queue.

  Queue mySyncdQ = Queue.Synchronized( new Queue());


这样在多线程环境下可以使用Queue的同步对象锁,来防止多线程同时对Queue进行写操作。如果想让其它线程不能访问Queue对象,则可以使用lock(queue),来达到这个目的。
分享到:
评论

相关推荐

    C#队列Queue多线程用法实例

    主要介绍了C#队列Queue多线程用法,实例分析了队列的相关使用技巧,需要的朋友可以参考下

    c#高效的线程安全队列ConcurrentQueueT的实现

    众所周知,在普通的非线程安全队列有两种实现方式: 1.使用数组实现的循环队列。 2.使用链表实现的队列。 先看看两种方式的优劣:  .Net Farmework中的普通队列Queue的实现使用了第一种方式,缺点是当队列空间不足会...

    c# 线程安全队列的用法原理及使用示例

    在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况...

    c#官方线程安全集合源码

    c#官方线程安全集合源码,concurrentBag concurrentqueue,concurrentset,concurrentDictionary,concurrentSet等

    c# queue 队列例子

    该事例用于演示C#中队列的处理,当声明一个队列后,开启一个线程监控此队列,当有消息时就立刻传送出去。

    c#队列Queue学习示例分享

    队列Queue,先进先出,先生产的货物先出货,后生产的货物后出货,下面看示例学习c#队列Queue

    C# Queue 队列类 demo

    // // //C#中队列Queue与线程的应用 // // static void Main(string[] args) { DocumentManager mg = new DocumentManager(); ProcessDocuments prcess = new ProcessDocuments(mg);

    workquere工作队列 多线程

    c#实现的工作队列,workquere,多线程管理-c# realization of the work queue, workquere, multi-threaded management

    C# wpf 多线程

    queue by their priority. The background workitem does not affect the UI * operation, so it just looks like the background workitem is processed by * another thread. But actually, all of them are ...

    带有消息机制的线程 - CustomMessageQueue

    vb.net/c# 编写的具有消息机制的多线程例子。线程平时阻塞自己,当使用自带方法发送来,则类似消息方式分发和处理。可以作为程序的底层基础框架,以此建立一套高效的运行模式。

    C#管理线程池的类ThreadManager

    C#管理线程池的类 /* How to use Thread Classs * * ============== * public ELMService() { InitializeComponent(); etm.ClalThreadPool("EmailThreads", (uint)ApplicationInfo.EmailParsingThreads); ...

    freelockqueue(多线程不需要加锁的队列性能很高)

    在多线程情况下,C#的队列入队和出队时需要现场同步,但这样会损失性能,此开源队列可以不需要同步,就能实现多线程操作,极大的提高了程序的运行效率

    C#信息采集工具实现

    简单C#信息采集工具实现 http://blog.csdn.net/xiaoxiao108/archive/2011/06/01/6458367.aspx 最近想整只爬虫玩玩,顺便熟悉下正则表达式。 开发环境 vs2008 sql2000 实现方法如下 1.先抓取网页代码 2.通过正则...

    C#线程池操作方法

    //设置线程池中的线程数最大为1000, //第一个为工作者线程,第二个为I/O线程 ThreadPool.SetMaxThreads(1000, 1000); for (int i = 0; i < 10;i ) { ThreadPool.QueueUserWorkItem(new WaitCallback...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    11.5.1 在C# 4.0中使用out类型参数修饰符允许协变性 331 11.5.2 在C# 4.0中使用in类型参数修饰符允许逆变性 332 11.5.3 数组对不安全协变性的支持 335 11.6 泛型的内部机制 335 11.6.1 基于值...

    DiskQueue:适用于.Net和Mono的线程安全,多进程(ish)持久队列库

    线程安全的多进程持久队列,其很大程度上基于 。 要求和环境 适用于.Net 4+和Mono 2.10.8+(建议3.0.6+) 需要访问文件系统存储 基本用法 PersistentQueue.WaitFor(...)是主要入口点。 这将尝试在给定的存储位置上...

    C# 消息队列.zip

    C#编程环境下的系统消息队列通讯实现(MessageQueue),包含ini文件操作,多线程运行(Thread)

    MessageEqueue

    队列, equeue,实现快速的,不需要外部锁的队列,不需要线程同步

    基于C#的游戏服务器后台.zip

    可以使用内置的ConcurrentQueue等线程安全数据结构,或者引入成熟的队列服务(如RabbitMQ、Azure Service Bus)。 数据存储: 配置关系型数据库(如MySQL、PostgreSQL)或NoSQL数据库(如MongoDB、Cassandra)来...

Global site tag (gtag.js) - Google Analytics