求教 关于多线程中生产者与消费者代码解析~ 感谢 本帖最后由 cnsjd 于 2009-10-26 11:46:38 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //如果有空位子,则对队列加锁,准备写入数据 //把缓冲区加锁 lock (thisLock) { //模拟下载 Thread.Sleep(500); //写入一个编号 list.Enqueue(download + 1); //更新统计信息 download++; //注意,对记录着缓冲区中文章个数的变量count的写操作必须进行同步 Interlocked.Increment(ref count); //报告 Console.WriteLine("1 file downloaded.NO.{0}, Content:{1}", download, download); } lock()//试图获取锁:thisLock;如果锁正在被其线线程使用则等待直到获取锁后才继续执行lock(){}里面的代码,所以{}中的代码是线程安全的;Interlocked.Increment(ref count); 可以直接改为:count++; 能详细点不?是不是 锁只有一个,,执行2个函数的线程都在抢这把锁?抢到才能执行LOCK内的代码??是不?还有就是lock (thisLock) 和 lock (this) 有何区别?此例中 Interlocked.Increment(ref count); 可以直接改为:count++; 确定??? lock可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待 生产者和消费者 lock(thisLock)是对thisLock加锁,lock(this)是对整个的this对象加锁,Interlocked.Increment(ref count); 可以直接改为:count++; 确定???Interlocked类的方法可以防止可能在下列情况发生的错误:计划程序在某个线程正在更新可由其他线程访问的变量时切换上下文;或者当两个线程在不同的处理器上并发执行时。此类的成员不引发异常。Increment 和 Decrement 方法递增或递减变量并将结果值存储在单个操作中。在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤: 将实例变量中的值加载到寄存器中。增加或减少该值。在实例变量中存储该值。如果不使用 Increment 和 Decrement,线程会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤。当第一个线程重新开始执行时,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失。Exchange 方法自动交换指定变量的值。CompareExchange 方法组合了两个操作:比较两个值以及根据比较的结果将第三个值存储在其中一个变量中。比较和交换操作按原子操作执行。但我一般都没用过此类,只要加了锁,我就直接对共享的变量进行操作,当然用了此类更加的安全, 发现一篇 好文,,大家可以看看 http://xxinside.blogbus.com/logs/46441956.html结贴了,,谢谢各位~~~ 各位高手帮帮忙 有在线的吗 我要做一个实训报告 内容是 Linux环境下生产者、消费者程序实例的编辑、编译、调试及运行过程。 数字音频 静音检查 求教如何使用ASP.NET(C#)编程实现将一个WORD文档存储在oracle数据库中 调用netmeeting sdk com接口的问题 vs2005 professional简体中文正式版下载 关于C# winForm窗体调用其他窗体按钮事件的问题。 求教:HyperLink传值问题,急急!! 关于这本书 请大神讲解如何将特殊的数据行转列后放在gridview中显示(数据库是oracle) 请教各位高手!! 关于图表的问题 求这2个函数的C#原型 ===========求教高手===========
//如果有空位子,则对队列加锁,准备写入数据
//把缓冲区加锁
lock (thisLock)
{
//模拟下载
Thread.Sleep(500); //写入一个编号
list.Enqueue(download + 1); //更新统计信息
download++;
//注意,对记录着缓冲区中文章个数的变量count的写操作必须进行同步
Interlocked.Increment(ref count); //报告
Console.WriteLine("1 file downloaded.NO.{0}, Content:{1}", download, download);
}
lock()//试图获取锁:thisLock;如果锁正在被其线线程使用则等待直到获取锁后才继续执行lock(){}里面的代码,所以{}中的代码是线程安全的;Interlocked.Increment(ref count); 可以直接改为:count++;
还有就是lock (thisLock) 和 lock (this) 有何区别?
此例中 Interlocked.Increment(ref count); 可以直接改为:count++; 确定???
生产者和消费者
lock(thisLock)是对thisLock加锁,lock(this)是对整个的this对象加锁,
Interlocked.Increment(ref count); 可以直接改为:count++; 确定???Interlocked类的方法可以防止可能在下列情况发生的错误:计划程序在某个线程正在更新可由其他线程访问的变量时切换上下文;或者当两个线程在不同的处理器上并发执行时。此类的成员不引发异常。Increment 和 Decrement 方法递增或递减变量并将结果值存储在单个操作中。在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤: 将实例变量中的值加载到寄存器中。增加或减少该值。在实例变量中存储该值。如果不使用 Increment 和 Decrement,线程会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤。当第一个线程重新开始执行时,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失。Exchange 方法自动交换指定变量的值。CompareExchange 方法组合了两个操作:比较两个值以及根据比较的结果将第三个值存储在其中一个变量中。比较和交换操作按原子操作执行。但我一般都没用过此类,只要加了锁,我就直接对共享的变量进行操作,当然用了此类更加的安全,
结贴了,,谢谢各位~~~