我有两个线程,
线程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. NOIP2018游记 & 退役记

    NOIP2018游记 & 退役记 我是一名来自湖北武汉华中师大一附中的高二\(OIer\),学习\(OI\)一年,今年去参加\(NOIP\),然后退役.这是一篇\(NOIP2018\)的游记, ...

  2. 如何在Vue项目中使用Element组件

    [前提] 1.安装webpack    cnpm install webpack -g 2.安装vue/vue-cli    cnpm install vue vue-cli -g 3.初始化vue  ...

  3. CF875E Delivery Club

    题意:两个邮递员,一个初始在s1,s2.需要依次给x1,x2,...,xn送快递.求所有时刻中两个邮递员的距离最大值的最小值.n<=100000,xi<=1e9. 标程: #include ...

  4. js闭包与java内部类

    在js中闭包用的比较广泛,主要解决变量作用域导致的问题.

  5. 2016.9.3初中部上午NOIP普及组比赛总结

    2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...

  6. 字符串哈希——1056E

    典型的字符串哈希题 字符串hash[i]:子串s[1-i]代表的值 要截取串s[l-r]  求hash[r]-hash[l-1]*F[len]即可 #include<bits/stdc++.h& ...

  7. SpringBoot学习笔记(一):SpringBoot简介

    SpringBoot为什么这么火? 为什么学习SpringBoot?总的来说就是简单. 使用SpringBoot免除了很多配置文件,越来越容易上手. 更轻量级的Web开发,免除了我们以前的server ...

  8. NAT后的FTP服务器部署笔记

    (2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日) 寒假开始以后,过年之前有一个任务,为实验室的人搭建一个FTP,用之前部署好的物理服务器.这本就是网管干 ...

  9. vue-cli2.0+webpack 项目搭建

    一:准备工作 安装nodejs + 安装webpack + 配置环境变量 => 确保在dos界面的任何路径都都可直接使用命令 二:搭建项目 1.全局安装vue脚手架  [DOS界面] npm i ...

  10. Angular+Bootstrap3导航菜单

    Angular+Bootstrap3导航菜单 AngularJS体验式编程系列文章,将介绍如何用angularjs构建一个强大的web前端系统.angularjs是由Google团队开发的一款非常优秀 ...