3、使用wait函数来锁定互斥器,使用release函数来解锁计数器。
  4、线程或进程如果在结束之前使用的mutex没有释放,那么此mutex成了被舍弃的互斥器,而一个等待的线程会返回WAIT_ABONDED_0,不管线程是使用ExitThread结束还是因为down掉而结束,这种情况都可能是存在的,虽然我们可以从wait的通知中获取到这种情况,但对此互斥器所保护的资源的损害,我们可能是无法修复的。所以应该尽量避免此现象的发生。
  5、使用createmutex时可以指定创建的线程拥有它,这样便可以不再使用wait函数来拥有它,如果不是这样,需要使用wait函数来获取,但有可能会在wait之前发生线程切换,这时候有可能其它的线程会在此线程之前使用wait来获取此互斥器。
  三、信号量
  1、 信号量是解决像生产者消费者这样模型的问题,它认为所有的资源都一样,信号量代表资源的数量,它可以拥有一个大值,当数量超过大值的时候,像仓库满了一样,生产者线程只有等待。而如果信号量为0时,消费者线程也只有等待。
  2、使用CreateSemaphore创建信号量,在创建时可以指定信号量的大值,如果创建的信号量已经存在,和CreateMutex一样,创建仍然会成功,但使用GetLastError会返回已经存在的信息。使用wait函数锁定信号量,每次锁定,信号量的值减1,直到0,锁定便会等待,使用ReleaseSemaphore来解锁,每次解锁信号量的值会增加一定的量,通常是1,直到大值,当达到大值时解锁便会不再起作用。
  3、信号通常用来保护缓冲区,有写入的线程,也有读取的线程
  四、事件机制
  1、事件机制是高级IO操作的一种模型,采用事件通知的方式,比如socket可以和事件绑定等,等检测到事件时再去处理详细的事件,Event的状态完全可以由用户控制,是具弹性的同步机制,只有两种状态,激发和未激发状态。它的状态不像mutex和samphore那样会因为wait函数的使用而改变,而是完全由用户控制状态。用户可以精确的告诉事件在什么时候做什么事
  2、使用CreateEvent创建事件,在创建时可以指定是否自动设置非激发状态,第二个参数bManualReset为true时表示需要调用ResetEvent手工设置为非激发状态,如果为false,会自动重置,即在激发状态(wait函数返回)之后,自动重置为非激发状态,其他wait函数需要等待。使用SetEvent设置事件为激发状态,因wait而等待的线程为被唤醒。使用PulseEvent改变事件的状态时,如果是需要手工设置的事件,则使事件处于激发状态,唤醒所有等待的线程,然后变为非激发状态。如果是自动设置的事件,则会把事件设置为激发状态,唤醒一个等待的线程,然后恢复为非激发状态。