Win32 中最具弹性的同步机制就属 events 对象了.Event 对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态.这两种状态全由程序来控制,不会成为 Wait...() 函数的副作用.    Event 对象之所以有大用途,正是因为它们的状态完全在你掌控之下.Mutexes 和 semaphores 就不一样了, 它们的状态会因为诸如WaitForSingleObject() 之类的函数调用而变化.所以,你可以精确告诉一个event 对象做什么事,以及什么时候去做.    E…
同步机制摘要Critical Section Critical section(临界区)用来实现"排他性占有".适用范围是单一进程的各线程之间.它是:  一个局部性对象,不是一个核心对象.  快速而有效率.  不能够同时有一个以上的 critical section 被等待.  无法侦测是否已被某个线程放弃.Mutex Mutex 是一个核心对象,可以在不同的线程之间实现"排他性占有",甚至即使那些线程分属不同进程.它是:  一个核心对象. 如果拥有 mutex 的…
哲学家进餐问题是这样子的:好几位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么等待,要么就吃饭.为了吃饭,哲学家必须拿起两支筷子(分放于左右两端).不幸的是,筷子的数量和哲学家相等,所以每支筷子必须由两位哲学家共享.图4-1 显现出这种状态.? FAQ 16:我如何避免死锁?…
本章讨论 Win32 同步机制,并特别把重点放在多任务环境的效率上.撰写多线程程序的一个最具挑战性的问题就是:如何让一个线程和另一个线程合作.除非你让它们同心协力,否则必然会出现如第2章所说的"raceconditions"(竞争条件)和"data corruption"(数据被破坏)的情况. 在典型的办公室文化中,协调工作是由管理者来执行的.类似的解决方案,也就是"让某个线程成为大家的老板".当然可以在软件中实现出来,但是每逢它们需要指挥时,就…
同步机制的最简单类型是使用 interlocked 函数,对着标准的 32 位变量进行操作.这些函数并没有提供"等待"机能,它们只是保证对某个特定变量的存取操作是"一个一个接顺序来".稍后我会把这些 interlocked 函数展示出来,因为唯有你自己亲身比较它们和其他同步机制的差异,才能够了解它们的用途.    考虑一下,如果你需要维护一个 32 位计数器的"排他性存取"性质,你该怎么做.你可能会想产生一个 critical section 或…
许多文件中都会提到 semaphores(信号量),因为在电脑科学中它是最具历史的同步机制.它可以让你陷入理论的泥淖之中,教授们则喜欢问你一些有关于信号量的疑难杂 症.你可能不容易找到一些关于 semaphores 的有用例子,但是我告诉你,它是解决各种 producer/consumer 问题的关键要素.这种问题会存有一个缓冲区,可能在同一时间内被读出数据或被写入数据. Win32 中的一个 semaphore 可以被锁住最多 n 次,其中 n 是 semaphore 被产生时指定的.n 常常…
Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性.或许你已经猜到了,mutex 是 MUTual EXclusion 的缩写.一个时间内只能够有一个线程拥有 mutex,就好像同一时间内只能够有一个线程进入同一个 critical section 一样.虽然 mutex 和 critical section 做相同的事情,但是它们的运作还是有差别的: 锁住一个未被拥有的 mutex,比锁住一个未被拥有的 critical section,需…
Jeffrey Richter 在他所主持的 Win32 Q&A 专栏(Microsoft Systems Journal,1996/07)中曾经提到过,Windows NT 和 Windows 95 在管理 dangling critical sections 时有极大的不同.在 Windows NT 之中,如果一个线程进入某个 critical section 而在未离开的情况下就结束,该 critical section 会被永远锁住.然而在 Windows 95 中,如果发生同样的事情,…
ngx_event.c :这个文件主要放置Nginx事件event模块的核心代码. 包含:进程事件分发器(ngx_process_events_and_timers).事件模块的模块和配置.模块初始化/配置初始化等事件模块初始化的核心函数. ngx_event_timer.c:定时器事件管理.主要放置定时器的代码. ngx_event_posted.c:主要用于 拿到accept锁的进程 处理accept和read事件的回调函数. ngx_event_pipe.c:主要用于处理管道 ngx_ev…
从上一篇文章[温故知新]C#委托delegate可知,委托delegate和事件Event非常的相似,区别就是event关键字,给delegate穿上了个“马甲”. 让我们来看官方定义: 类或对象可以通过事件向其他类或对象通知发生的相关事情. 发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”. event 关键字用于在发行者类中声明事件. 定义非常明确,通过事件向其他类或对象通知发生的相关事情,用来实现的观察者模式. 还是通过之前的代码例子,看看声明delegate和ev…