互斥对象的使用和Event的使用基本是一致的。区别在于,Mutex被称为全局互斥对象,不仅可以在多线程中使用,甚至还可以在多进程中使用。Mutex是一个命名对象,所有用同一个名字创建的Mutex都会被视为同一个对象。
无论是Mutex还是Event都有同步和互斥两种用法。很多资源因为本身的特性,要求同时只能有一个线程访问,比如vector之类的数据结构,同时有两个线程做插入操作,数据就会出错;代码也是一样,有一些代码本身是不允许在多线程中间同时进入的。这时候就可以用Mutex或者Event来进行互斥。
具体方法是创建一个初值为True(Set)的AutoReset(ManualReset参数为FALSE)的Mutex或者Event,然后每次要访问对应的资源的时候首先WaitForSingleObject,成功Wait到之后,Event或者Mutex会变成False(Unset)的状态,其他线程就无法进入;等到使用结束之后,再SetEvent使Mutex或者Event恢复Set的状态,让其他等待的线程进入。
CriticalSection之类的模块在内部也是使用了Event或者Mutex来完成互斥的。注意需要对每一个互斥的资源或代码使用一个独立的Mutex或者Event。
举个简单的例子帮你理解:
有个售票系统,假如2个线程在执行售票,有一张票号为001,假如第一个线程正在卖出001这张票,而第二个线程也正准备卖出001这张票,而001这张票是唯一的,如果没有互斥机制,告诉第二个线程不要再卖出001,因为第一个线程正在卖出001,那么就会出错,这就是线程互斥;线程同步比如2个线程分东西,一人分一个,如果不实现同步处理,那么就会导致最后2人分的东西不一样。
在代码中,比如一个变量,线程1在访问,线程2也在访问,那么就要根据具体需求实现线程的同步或者互斥,否则这个变量就会在线程1未知的情况下被线程2改变,发生不可预知的结果,反之也一样。多线程实现代码或资源的共享是需要互斥量来控制的,如以上所述,如果不加控制,将产生不可预知的后果。