AutoResetEvent waitone set进一步理解补充
AutoResetEvent 的定义
//定义两个信号锁
AutoResetEvent ReadTxt = new AutoResetEvent(false);
AutoResetEvent UploadTxt = new AutoResetEvent(false);
默认是false 也就是关闭状态了。这里要 理解信号 锁,实际就像某大神说的,把waitone()想象成地铁的刷卡进站,就是那个刷卡器,你用set()卡刷一次,waitone()由关闭状态进入打开状态。运行完waitone下边剩下的程序。一般waitone不在循环内的话,执行一次,程序结束退出,相当于线程执行的程序退出了,waitone 下次失效,因为程序都失效了,waitone也就没什么用处了,所以不在循环内,waitone 感觉没什么鸟用,不重复利用waitone跟set来回切换的话,直接用一个thread 运行一下就好了。
所以要用好上边的AutoResetEvent 中的waitone和set 中间加循环机制才会实现两个线程之间,通过set waitone 来回切换。
在学习多线程的过程中,需要循序渐渐,要有耐心,多线程的端倪才会露出,才会慢慢掌握。
就类似下边一个程序
程序的片段
private void Readtxt(object lst)
{
AutoResetEvent ReadTxt = (lst as List<AutoResetEvent>)[];
AutoResetEvent UploadTxt = (lst as List<AutoResetEvent>)[];
try
{
string file = Pathstr; ;
StreamReader sr = new StreamReader(file, System.Text.Encoding.Default);
while (sr.Peek() > -)
{
line = sr.ReadLine().ToString().Replace("\r\n", "");
//跳过行空格
if (line.Trim() != "")
{
Thread.Sleep();
string[] lines = line.Split("".ToArray(), StringSplitOptions.RemoveEmptyEntries);
if (lines.Length >= )
{
zsNum = new NumCon();
zsNum.zsNum = lines[];
list.Add(zsNum);
if (list.Count % == )
{
ReadTxt.WaitOne();
Console.WriteLine("");
UploadTxt.Set();
ReadTxt.WaitOne(); 是个刷卡器,门禁,程序运行到此停止,需要等待set 命令出现,才会进行下一步,再此就是
ReadTxt.Set(); 它不出现程序就不执行,它出现了,程序执行完下边的代码,注意主程序是在循环里边,执行完下边的代码,主程序继续执行这个循环,又在waitone()
处停下。等待set信号,上边我这个程序是循环读取txt内容,每十个加入list中,通过上边程序,第一次执行到waione() list
中已经加入了10个数,程序运行UploadTxt.Set();时, 主程序也在继续运行循环里边的数据,导致读list的时候,实际是加入了20个数,通过不停的调试,设置断点,
加代码,最后才悟到这个问题。
同时设置断点调试多线程需要注意一下几个问题
线程的程序若不设置断点的话,从主程序到线程程序,你按f11是不会逐语句到线程的,可以想想多线是同时并发的,所以在某一刻无法逐语句的。
只有懂得了上边的概念,不要怀疑程序编译问题,出错总有程序逻辑或者自己思维上的误差导致的。
上边的方法可以通过概念和 ,你想检查的地方设置断点,程序运行过去或者乱跳过去时看看,有时多线程设置断电点后,和实际运行时结果运行也有差异,在调试上边
程序时已经充分的体现出来。
AutoResetEvent waitone set进一步理解补充的更多相关文章
- Java内存管理的进一步理解-模拟过程图解
Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区 方法区存放装载的类数据信息包括: ...
- 对于python装饰器结合递归的进一步理解
对于python装饰器结合递归的进一步理解 代码如下: import functools def memoize(fn): print('start memoize') known = dict() ...
- 个人对AutoResetEvent和ManualResetEvent的理解(转载)
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- 个人对AutoResetEvent和ManualResetEvent的理解
一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非 ...
- [转]个人对AutoResetEvent和ManualResetEvent的理解
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- 对iOS后台模式最多10分钟运行时间的进一步理解
在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...
- 对Java中字符串的进一步理解
字符串在程序开发中无处不在,也是用户交互所涉及到最频繁的数据类型,那么字符串不仅仅就是我们简单的理解的String str = "abc";一起来更加深入的看一下 在Java中,字 ...
- 通过回调函数的理解来进一步理解ajax及其注意的用法
一,再一次理解回调函数 (function($){ $.fn.shadow = function(opts){ //定义的默认的参数 var defaults = { copies: 5, opaci ...
- 『cs231n』卷积神经网络的可视化与进一步理解
cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解,其中原论文翻译比博文更容易理解,但是太长,而博文是业者而非 ...
随机推荐
- 读CopyOnWriteArrayList有感
除了加锁外,其实还有一种方式可以防止并发修改异常,这就是将读写分离技术(不是数据库上的). 先回顾一下一个常识: 1.JAVA中“=”操作只是将引用和某个对象关联,假如同时有一个线程将引用指向另外一个 ...
- 【转】C#环形队列
概述 看了一个数据结构的教程,是用C++写的,可自己C#还是一个菜鸟,更别说C++了,但还是大胆尝试用C#将其中的环形队列的实现写出来,先上代码: 1 public class MyQueue< ...
- django Q和F查询
Q查询——对对象的复杂查询F查询——专门取对象中某列值的操作 Q查询1.Q对象(django.db.models.Q)可以对关键字参数进行封装,从而更好地应用多个查询,例如: from django. ...
- django model 中class meta
class Meta: ordering = ['-num', 'length'] verbose_name = 'name' verbose_name_plural = 'names' orderi ...
- MFC重载关闭按钮
首先介绍一下WindowProc函数. 函数功能:该函数是一个应用程序定义的函数.它处理发送给窗口的消息.WNDPROC类型定义了一个指向该回调函数的指针.WindowProc是用于应用程序定义函数的 ...
- php中好用的时间函数
//查询数据30天的数据$y=date("Y",time());$m=date("m",time());$d=date("d",time() ...
- LeetCode344:Reverse String@Python
Write a function that takes a string as input and returns the string reversed. Example: Given s = &q ...
- Python 之WEB框架
wsgi模块实现socketPython web框架: - 自己实现socket 代表:Tornado - 基于wsgi(一种规范,统一接口) 代表: Django 自己开发web框架(基于wsgi) ...
- linux进程及进程控制
Linux进程控制 程序是一组可执行的静态指令集,而进程(process)是一个执行中的程序实例.利用分时技术,在Linux操作系统上同时可以运行多个进程.分时技术的基本原理是把CPU的运行时间划 ...
- LZW压缩算法
转载自http://www.cnblogs.com/jillzhang/archive/2006/11/06/551298.html 记录此处仅自己供学习之用 lzw解压缩算法: 用单个字符初始化字符 ...