我有两个线程,
线程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. BP 算法之一种直观的解释

    0. 前言 之前上模式识别课程的时候,老师也讲过 MLP 的 BP 算法, 但是 ppt 过得太快,只有一个大概印象.后来课下自己也尝试看了一下 stanford deep learning 的 wi ...

  2. 廖雪峰Java13网络编程-3其他-1HTTP编程

    1.HTTP协议: Hyper Text Transfer Protocol:超文本传输协议 基于TCP协议之上的请求/响应协议 目前使用最广泛的高级协议 * 使用浏览器浏览网页和服务器交互使用的就是 ...

  3. IDE 插件新版本发布,开发效率 “biu” 起来了

    近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明. 本地应用一键 ...

  4. C++ Builder VCL库函数简介

    C++ Builder VCL库函数简介 2002-07-05· · ··C++builder资源中心 1 2 3 下一页 一.BORLAND C++ BUILDER VCL的内存管理函数 1. Al ...

  5. QQ交流群

  6. 大文件传输 分片上传 上传id 分片号 授权给第三方上传

    https://www.zhihu.com/question/39593108 作者:ZeroOne链接:https://www.zhihu.com/question/39593108/answer/ ...

  7. “Error: Encountered an improper argument”的解决方法

    之前遇到过的问题,后来解决后再次遇到又忘记了, 这是keil 的bug 路径只要都是字母就可以了

  8. 第一周课堂笔记2th

    上课笔记2th https://mubu.com/doc/2gxvIvVLG0(老师笔记网址) 1.     python python运行过程 把源代码转化成字节码(机器不能识别) 也可能不产生py ...

  9. jquery移除元素某个属性

    removeAttr() 方法从被选元素中移除属性. 例如:$("p").removeAttr("style");

  10. springboot 2+ druid

    springboot 1+ druid druid 配置 import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid ...