惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cisco Talos Blog
Cisco Talos Blog
阮一峰的网络日志
阮一峰的网络日志
云风的 BLOG
云风的 BLOG
D
Docker
Vercel News
Vercel News
IT之家
IT之家
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
V
Visual Studio Blog
Engineering at Meta
Engineering at Meta
腾讯CDC
Google DeepMind News
Google DeepMind News
I
InfoQ
博客园 - 三生石上(FineUI控件)
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
博客园 - Franky
The Cloudflare Blog
A
About on SuperTechFans
有赞技术团队
有赞技术团队
Y
Y Combinator Blog
T
Tenable Blog
P
Proofpoint News Feed
Recorded Future
Recorded Future
Security Latest
Security Latest
H
Hackread – Cybersecurity News, Data Breaches, AI and More
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 聂微东
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Google Online Security Blog
Google Online Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
U
Unit 42
The Hacker News
The Hacker News
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
F
Full Disclosure
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理
Hugging Face - Blog
Hugging Face - Blog
V
V2EX
Project Zero
Project Zero

博客园 - sashow

c++知识点--extern "C"的作用 - sashow - 博客园 粘贴一点有用的东西留存-- Control 类的事件顺序 开始→运行→输入命令集锦 c#的ThreadPool使用笔记(四)--实例:端口扫描程序 c# 中Label 标签和.resx 文件中的换行问题 - sashow 计算某天是星期几的算法 find 和 grep 命令 - sashow Sql Server 中由数字转换为指定长度的字符串 [分享] C# 中 Socket 进行数据接收的一点心得 sql server 2005 使用问题总结 [转]解决无法显示所有文件和文件夹,无法显示隐藏文件和文件夹 FileStream进行Read() 操作后文件指针指向当前位置 用回车键模拟TAB键的方法 c#的ThreadPool使用笔记(二) c#的ThreadPool使用笔记(一) 人民币大小写转换(C#) 放弃还是继续? 随便写点东西 [转贴]Informix SQL函数的详细用法
c#的ThreadPool使用笔记(三)
sashow · 2009-06-08 · via 博客园 - sashow

   很久没有接着写这个系列的东西了,自己拿起来,还有些恍惚,因为有二年多的时间没有进行代码的编写了。

 上次解决了如何象线程传入参数,但是没有解决在主线程中获取发生了变化的参数的问题,引起这个问题的原因有两个:

1、线程池中的线程的启动、终止不是由我们设计的程序来控制的;

2、线程池中的线程执行完成后是没有返回值的。(这实际上与操作系统的线程调度和内存分配策略有关)

所以要想取得返回值,就需要解决这两个问题。

对于第一个问题,我们很容易想到操作系统提供的一种机制 “信号灯”(也有叫“信号量”、“信号”的),操作系统提供的这种机制允许进程之间进行通讯,呵呵,这样我们就可以让子线程与主线程进行通讯了。

对于第二个问题,由于线程没有返回值,我们可以传递给线程的参数中设置一个字段用于存储返回值,也可以通过通过获取 WaitCallBack 方法所在类的属性来获取(当然,在线程中这个属性是对其进行了改变的)。

现在,简单的说一下“信号灯”机制,打一个跟厕所有关的比喻,(不是很雅^_^),在火车上,当A上厕所的时候,他会将厕所的门锁上,对外标识一个“有人”的表示,当他解决完以后,他会打开门,“有人”的标识就会变成“无人”的标识,这样B就可以进去了,而如果A不把这个标识改变,B就算憋死也进不去的。(当然暴力方式排除在外)。C# 提供的 AutoResetEvent就是这样一种“信号灯”,定义这个类的变量,并传递到子线程,在子线程将结束时,将该“信号灯”设置为 true(“无人”)状态,这样主线程就可以进入了(开始执行)。

同样,我们还有上公共厕所的经历,在公共厕所了有很多个便池,当然还有一个厕所管理员,这时,A1,A2,A3……就可以在厕所管理员这里领取一个牌匾,同时进去解决“问题”, 如果,厕所管理员不是很bt,当A1出来的时候,他会放B1进去,但是也有Bt的,非得等到A1,A2,A3……都解决问题了,才让B1,B2,……进去,这就是WaitHandle.WaitAll()和WaitHandle.WaitAny(),WaitHandle.WaitOne()的区别,这是可以使用ManualResetEvent的“信号灯”

当然,还有一些线程之间也会争用资源,要达到同步的话,可以使用Monitor,Mutex的“信号灯”。

总之,信号灯机制提供了一个对子线程与主线程,子线程与子线程之间进行通讯的机制,这些通讯机制的共同特点是某个线程释放了资源(给出一个信号),其他的线程(主线程)才开始执行。

接着,我用一个端口扫描的程序来具体说明一下。