我有两个线程,
线程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解决!

C#多线程之间事件通知的更多相关文章

  1. python处理多线程之间事件通讯方法

    一.什么是事件 每执行一个事情,肯定有该事情的执行后状态,那事件就是该事情发生的信号 在程序中,多线程之间需要通讯,而事件就是方便线程之间的通讯 案例: 1.服务器启动需要5秒 2.客服端启动后去链接 ...

  2. C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

    最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也 ...

  3. PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

    源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkP ...

  4. Linux内核基础--事件通知链(notifier chain)

    转载: http://blog.csdn.net/wuhzossibility/article/details/8079025 http://blog.chinaunix.net/uid-277176 ...

  5. 【java】-- 多线程之间实现通讯

    1.多线程之间如何实现通讯 1.1.什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同. 画图演示 1.2.多线程之间通讯需求 需求:第一个线程写入(inpu ...

  6. Linux内核基础--事件通知链(notifier chain)good【转】

    转自:http://www.cnblogs.com/pengdonglin137/p/4075148.html 阅读目录(Content) 1.1. 概述 1.2.数据结构 1.3.  运行机理 1. ...

  7. Linux内核基础--事件通知链(notifier chain)【转】

    转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...

  8. (25)zabbix事件通知

    概述 我们前面花了大量时间去讲解item.trigger.event都是为发送报警做准备的,什么是事件通知呢?简单的说故障发生了,zabbix会发邮件或者短信给你,告诉你服务器的一些状况. 如果没有通 ...

  9. Java多线程Condition定点通知

    多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下:A打印5次,B打印10次,C打印15次接着 A打印5次,B打印10次,C打印15次 来10轮 package com.yan ...

随机推荐

  1. thinkphp 统计查询

    在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 大理石平台检定规程 ...

  2. CF1097E Egor and an RPG game

    最少反链划分数 = 最长链.实现:每次找出所有极大元作为一个反链. 任意长度小于k * (k + 1) / 2的排列都能被划分为不多于k个单调序列.且这是一个紧的上界. 然后这题就可以切了. 题意:给 ...

  3. duilib教程之duilib入门简明教程5.自绘标题栏

    如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理.如果用duilib,就是小case啦.    duilib其实并没有区分标题栏和 ...

  4. Spring中的Junit

    Spring中的Junit package com.imooc.test.base; import org.junit.After; import org.junit.Before; import o ...

  5. System.Web.Mvc.ViewResultBase.cs

    ylbtech-System.Web.Mvc.ViewResultBase.cs 1.程序集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, Pub ...

  6. js 实现页面局部(或图片)放大功能(vue)

    方法: adjustStart1 (e) { e.preventDefault() let event = e.touches if (event.length === 2) { this.style ...

  7. 23-css补充

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. vue 模版组件用法

    第一种 //首先,别忘了引入vue.js <div id="user_name_01"></div> <script src="../nod ...

  9. 【心无旁骛】vue-ts-daily

    这是一个非常有意思的项目,我们先来看看效果 这个项目所用的技术也比较有意思,它的技术栈为vue2.5 + Typescript + vuex + vue-router 放下博主的项目地址吧,https ...

  10. Python开发利器Pycharm

    可以新建项目的时候,在下面的小扳手那里创建虚拟化环境.若想安装包,直接file->setting里面找到对应项目,然后添加新的包即可.   视频地址:http://edu.51cto.com/c ...