基元线程同步构造之waithandle中 waitone使用
2014-02-27 10:32
525 查看
在使用基元线程同步构造中waithandle中waitone方法的讲解:
调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。
WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。
(1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。
ManualResetEvent manualWait = new ManualResetEvent(false);
(2): WaitHandle没有Set方法,所以不能使暂停的线程得以继续,所以 一般不单用WaitHandle。其常会用作参数,尤其是AutoResetEvent和ManualResetEvent都用到的情况,提供一定的通用性。
AutoResetEvent、ManualResetEvent都继承自WaitHandle,都有Set()和Reset()方法,当然也继承了WaitOne()方法和两个状态。
(1)ManualResetEvent的Set()和Reset()方法即上面的功能,将状态分别设成绿灯和红灯。当一个手动重置事件为true时,它解除正在等待它的所有线程的阻塞,因为内核不将事件自动重置回false;相反,你的代码必须将事件手动重置回false.
(2)AutoResetEvent比较特别,正如名字所示,在Set()完后,它会立即自动调用Reset,所以一般只用Set()方法。当一个自动重置事件为true时,它只唤醒一个阻塞的线程,因为在解除第一个线程的阻塞后,内核将事件自动重置为false。
说明:这类对象可以被用在多个并发线程中,只要调用[b]WaitOne,则都会暂停运行。ManualResetEvent的Set,可以让所有这些线程都继续运行,Reset又都停止,而AutoResetEvent则通过Set可实现一次只有一个被阻止的线程释放。[/b]
[b] 示例:[/b]
[b] [/b]
using System;
using System.Threading;
class WaitOne
{
//初始化为 false,即Nonsignaled,必须调用set后才能变成Signaled,
//autoEvent.WaitOne();之后的代码才会运行,如果去掉
//ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码就永远不会运行了
//如果初始化为 true即 new AutoResetEvent(true),去掉 ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码也可运行
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.\nMain ending.");
Console.ReadLine();
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。
调用waithandle的waitone方法阻止当前线程(提前是其状态为Nonsignaled,即红灯),直到当前的 WaitHandle 收到绿灯信号。
WaitHandle有两个状态"Signaled" and "Nonsignaled",前者可以理解为绿灯,绿灯状态时WaitOne方法无效,当前线程不会被阻止,后者可以理解为红灯,WaitOne()方法会阻止当前线程。
(1):一般来说,初始状态都是"Nonsignaled",即红灯,这样当调用WaitOne时,线程会暂停掉,这正是通常情况下我们调用WaitOne时想要的效果。这也正是Reset(字面义“重置”)被定义为设成红灯的原因。所以初始化时参数用false,代表初始状态为红灯。
ManualResetEvent manualWait = new ManualResetEvent(false);
(2): WaitHandle没有Set方法,所以不能使暂停的线程得以继续,所以 一般不单用WaitHandle。其常会用作参数,尤其是AutoResetEvent和ManualResetEvent都用到的情况,提供一定的通用性。
AutoResetEvent、ManualResetEvent都继承自WaitHandle,都有Set()和Reset()方法,当然也继承了WaitOne()方法和两个状态。
(1)ManualResetEvent的Set()和Reset()方法即上面的功能,将状态分别设成绿灯和红灯。当一个手动重置事件为true时,它解除正在等待它的所有线程的阻塞,因为内核不将事件自动重置回false;相反,你的代码必须将事件手动重置回false.
(2)AutoResetEvent比较特别,正如名字所示,在Set()完后,它会立即自动调用Reset,所以一般只用Set()方法。当一个自动重置事件为true时,它只唤醒一个阻塞的线程,因为在解除第一个线程的阻塞后,内核将事件自动重置为false。
说明:这类对象可以被用在多个并发线程中,只要调用[b]WaitOne,则都会暂停运行。ManualResetEvent的Set,可以让所有这些线程都继续运行,Reset又都停止,而AutoResetEvent则通过Set可实现一次只有一个被阻止的线程释放。[/b]
[b] 示例:[/b]
[b] [/b]
using System;
using System.Threading;
class WaitOne
{
//初始化为 false,即Nonsignaled,必须调用set后才能变成Signaled,
//autoEvent.WaitOne();之后的代码才会运行,如果去掉
//ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码就永远不会运行了
//如果初始化为 true即 new AutoResetEvent(true),去掉 ThreadPool.QueueUserWorkItem( // new WaitCallback(WorkMethod), autoEvent);这段代码,
//autoEvent.WaitOne();之后的代码也可运行
static AutoResetEvent autoEvent = new AutoResetEvent(false);
static void Main()
{
Console.WriteLine("Main starting.");
ThreadPool.QueueUserWorkItem(
new WaitCallback(WorkMethod), autoEvent);
// Wait for work method to signal.
autoEvent.WaitOne();
Console.WriteLine("Work method signaled.\nMain ending.");
Console.ReadLine();
}
static void WorkMethod(object stateInfo)
{
Console.WriteLine("Work starting.");
// Simulate time spent working.
Thread.Sleep(new Random().Next(100, 2000));
// Signal that work is finished.
Console.WriteLine("Work ending.");
((AutoResetEvent)stateInfo).Set();
}
}
这是个人的一点点理解,希望大伙有好的意见再拍拍砖。。。。。。。
相关文章推荐
- 基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)
- 基元线程同步——内核模式构造(WaitHandle,EventWaitHandle,AutoResetEvent,ManualResetEvent,Semaphore,Mutex)
- Silverlight 2.0使用Lock, Interlocked, EventWaitHandle, Monitor来实现线程同步//C#线程同步的几种方法
- 基元线程同步——内核模式构造
- 线程同步 wait 和 notify 使用例子
- C#线程同步(4)- 通知&EventWaitHandle一家
- 基元线程同步构造之 在一个内核构造可用时调用一个方法
- 【C#进阶系列】28 基元线程同步构造
- C# WaitHandle 使用教程
- CLR via C# I/O基元线程同步构造
- EventWaitHandle使用方法小记
- C# 线程同步(4)- 通知&EventWaitHandle一家
- WaitHandle——使用Semaphore
- c#多线程同步之EventWaitHandle再次使用
- 白话并发冲突与线程同步(3)——Mutex、EventWaitHandle、AutoResetEvent 和 ManualResetEvent
- 【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent
- 【深度好文】多线程之WaitHandle-->派生-》Mutex信号量构造
- 基元线程同步构造之 Mutes(互斥体)
- WaitHandle——使用Semaphore
- 使用EventWaitHandleSecurity进行程序间同步时,在非英语机器上程序hang住了。