AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
下边有个 循环调用线程写奇偶数的程序
class TheadTest
{
//定义一个Stream对象接收打开文件
private FileStream st;
//构造方法
public TheadTest()
{
}
public void Start()
{
//定义两个信号锁
AutoResetEvent ateA = new AutoResetEvent(false);
AutoResetEvent ateB = new AutoResetEvent(false);
//把信号锁加入到List中
List<AutoResetEvent> lst = new List<AutoResetEvent>();
lst.Add(ateA);
lst.Add(ateB); //定义带参数的输出偶数线程
Thread thrEven = new Thread(new ParameterizedThreadStart(OutPutEven));
thrEven.Name = "偶数线程";
//把两个信号锁传入线程
thrEven.Start(lst); //定义带参数的输出奇数线程
Thread thrOdd = new Thread(new ParameterizedThreadStart(OutPutOdd));
thrOdd.Name = "极数线程";
thrOdd.Start(lst);
} private void OutPutEven(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1]; for (int i = 0; i < 100; i += 2)
{
//设置本线程为无信号
ateA.WaitOne();
//输出
Console.WriteLine(i);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateB.Set(); //设置输出奇数线程有信号
//Thread.Sleep(500);
}
}
private void OutPutOdd(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1];
//设置偶数线程先输出
ateA.Set();
for (int i = 1; i < 100; i += 2)
{
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
}
}
}
此时两个线程执行方法都在循环中没问题 ,程序是交互进行的,ateA 先执行,然后waitone ,等待ateB执行完发送set信号。
把其中一个循环去掉,
// for (int i = 1; i < 100; i += 2)
// {
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
// }
运行结果:
就运行了三行拉倒了,而且是
ateA 运行了两次,
ateB运行了一次。 没有循环只运行了一次,线程就结束了。
ateA 的循环即使发送
ateB.set()信号也没用了,线程已经关闭了,运行一次就关闭了,当然应该考虑到线程启动关闭的运行效率,应该就是这么个规矩,线程启动要执行哪个程序,执行完毕,
、线程自动退出。实际运行中,这里有些理解上挺不爽的,不知道别人怎么样。
从理解的角度上讲,线程应该一直在那启动着,给予set信号,线程执行程序开始运行,执行完后等待下次set信号,而不应该退出。
所以要想用上这个知识点在程序中,还需要改进不少。这个问题上次处理上位机时碰到,当时已经知道这个问题,今天因为上边的写法中,参数和加了一个循环,
导致自己出现错觉了,以为这种写法就可以给信号执行,没信号不执行,执行完之后线程挂起而不是退出的功能
AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方的更多相关文章
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- 并发编程: GIL锁、GIL与互斥锁区别、进程池与线程池的区别
一.GIL 二.关于GIL性能的讨论 三.计算密集测试 四.IO密集测试 五.GIL与互斥锁 六.TCP客户端 七.进程池 八.进程什么时候算是空闲 九.线程池 一.GIL GIL Global In ...
- quartz源码分析——执行引擎和线程模型
title: quartz源码分析--执行引擎和线程模型 date: 2017-09-09 23:14:48 categories: quartz tags: [quartz, 源码分析] --- - ...
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行
Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...
- CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了
协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...
- 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)
/* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLoc ...
- C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗
结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- c#中Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程 ...
随机推荐
- 关闭和开启oracle
1.使用sqlplus 启动和关闭数据库. 答:使用sqlplus以sysdba的身份登录数据库 因为我的数据库是启动状态,所以我就先演示数据库的关闭 数据库的关闭使用语句shutdown immed ...
- 在 github 上获取源码
比如访问: https://github.com/alifellod/NWebGather 可以找到下面的源码获取方式. 在github开源项目的页面上可以找到上图的三个获取源码方式. 使用git的网 ...
- Xamarin.Froms项目中包含的文件
Clearly, the program created by the Xamarin.Forms template is very simple, so this is an excellent o ...
- ruby中proc和lambda的return区别
学习ruby有一段时间了,但是我看了好几遍proc和lambda的return区别的区别讲解,始终没明白到底什么区别,今天上午又看,终于感觉是茅塞顿开有点领悟了 一下内容部分来自<<rub ...
- git 分批后的数据
如果涉及到大文件的 git 传输, 我们可能会收到下面错误: sourceTree 的错误. 命令行的错误: $ git clone https://********/gopher.git C ...
- 1.date 命令
转自:http://www.cnblogs.com/peida/archive/2012/12/13/2815687.html 在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用 ...
- Codeforces 723e [图论][欧拉回路]
/* 不要低头,不要放弃,不要气馁,不要慌张. 题意: 给你一个有n个点,m条边的无向图,给每条边规定一个方向,使得这个图变成有向图,并且使得尽可能多的点入度与出度相同. 输出有多少个这样的点并且输出 ...
- UITapGestureRecognizer响应顺序是怎么样的
一个scrollview上有几个按钮在scrollview上add 了一个单击事件 singletap = [[UITapGestureRecognizer alloc] initWithTarget ...
- 49. Search in Rotated Sorted Array && Search in Rotated Sorted Array II
Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you before ...
- java环境
http://www.iyunv.com/thread-65867-1-1.html http://www.360doc.com/content/15/0525/19/21365845_4732029 ...