我有两个线程,
线程1接受网络数据,存到队列;
线程2取队列,进行各种复杂的处理然后绘制到界面上;
想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西,很费cpu,怎么弄?
我现在用的是C#的ManualResetEvent,线程1给队列中加数据时,置为有信号,
线程2中,队列为空置为无信号,这样问题是置了好多个有信号,好浪费
也想过有AutoResetEvent,就怕两次set激活事件时间间隔太短会有问题........
怎么办啊????,不要循环检查而是等到1的通知

回复次数:10

关注
wyd1520
本拉灯
本版等级:

 
 
#1 得分:20回复于: 2014-03-10 22:42:37

请百度 生产者与消费者。。。就会得到你想要的
关注
wyd1520
本拉灯
本版等级:

 
 
#2 得分:0回复于: 2014-03-10 22:44:05
AutoResetEvent 用这个没问题的,
就算你两次Set 只要上次没执行完,就是没进入到WaitOne()阻塞,你执行多少次Set都没用
关注
lifang123456
我爱大家369
本版等级:

 
#3 得分:0回复于: 2014-03-10 22:56:36
引用 2 楼 wyd1520 的回复:

AutoResetEvent 用这个没问题的,
就算你两次Set 只要上次没执行完,就是没进入到WaitOne()阻塞,你执行多少次Set都没用

自动重置事件,两次set时间间隔很小的话,另一个线程WaitOne继续一次的,那就不对了,
线程1:
有数据1->加入队列->AutoResetEvent.set()
有数据2->加入队列->AutoResetEvent.set()
线程2:
while(true)
{
   AutoResetEvent.WaitOne();
   取队列
   ....进行其他较耗时操作
}
线程2只循环一次,取一次队列啊,我要想取两次值;或者用其他办法,只要让线程2别
这样:
whiile(true)
{                      ---------------->这样很消耗cpu,或者会抢占其他线程cpu的
   object obj = queue.deueue();//取头元素
   if(null == obj)
   {
        ....进行其他较耗时操作
    }
}
?

关注
wyd1520
本拉灯
本版等级:

 
 
#4 得分:20回复于: 2014-03-10 23:05:21

你搞错了吧
要这样子

线程1 有数据调用XXXEnQueue

private void XXXEnQueue(xxx) 进队列
{
    lock(queue)
    {
       queue.Enqueue(xxx);
       
    }
    auto.Set();
}

private xxx XXXDequeue() //取头元素
{
   lock(queue)
   {
      return queue.Dequeue();
   }
}
线程2

whiile(auto.WaitOne()) 这样就成了
{                      
    while(queue.Count>0)
    {
       object obj = XXXDequeue();
       if(null == obj)
       {
        ....进行其他较耗时操作
       }
    }
}

关注
lifang123456
我爱大家369
本版等级:

 
#5 得分:0回复于: 2014-03-10 23:29:17
那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊
关注
lifang123456
我爱大家369
本版等级:

 
#6 得分:0回复于: 2014-03-10 23:30:05
那什么时候reset()?还有多个线程之间都可以auto.Set()吗?没加锁啊
关注
wyd1520
本拉灯
本版等级:

 
 
#7 得分:0回复于: 2014-03-10 23:46:34
你去reset()他做啥,根本不用reset();
多个线程之间当然可以auto.Set(),你要了解生产者与消费者。关系。而不是一脑子在set reset上
关注
lifang123456
我爱大家369
本版等级:

 
#8 得分:0回复于: 2014-03-11 13:19:19
我说的是手动事件reset;
您没听懂我的原问题........

如果用自动事件会是这样(有问题的):
thread1 接data1时加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,
接data2后加入队列,set触发事件后thread2会把waitone走过后立马变为无信号,
如果thread1中两次set时间间隔很小,thread2只会把waitone走过一次,就不再读数据了...........

关注
lifang123456
我爱大家369
本版等级:

 
#9 得分:0回复于: 2014-03-11 22:00:07
用Monitor.Pulse解决!

最新文章

  1. python函数 与 函数式编程
  2. aop配置
  3. ALSA 学习小记
  4. phonegap学习笔记
  5. webconfig 文件加密处理
  6. Python自动化之YAML解析
  7. php手册杂记
  8. 二级c程序设计题(1)
  9. 无需操作系统和虚拟机,直接运行Python代码
  10. Mysql 存储程序
  11. .Net 使用 Oracle 提供组件访问数据库
  12. Java [leetcode 5] Longest Palindromic Substring
  13. BZOJ 1022 SHOI2008 小约翰的游戏John 博弈论
  14. 理解C#中的继承
  15. Verilog 读写文件
  16. PL/SQL 编程(一)基础,变量,分支,循环,异常
  17. 数据分析---《Python for Data Analysis》学习笔记【02】
  18. CSS公共清除浏览器默认样式
  19. Learning-MySQL【3】:数据类型和运算符
  20. 对 static const char* const str[] = {“string”} 的理解

热门文章

  1. 【默默努力】PixelFire
  2. css,js文件后面加一个版本号
  3. about how to determine a prime number
  4. Django之ORM查询优化
  5. 线性回归和梯度下降代码demo
  6. Java-MyBatis-MyBatis3-XML映射文件:select
  7. Linux RHEL7(CentOS7源) 安装 Nginx
  8. Mysql千万级数据性能调优配置
  9. day21 作业
  10. php filemtime filectime fileatime的区别