上一篇说明了多线程是存在着问题的,起始就是多线程操作同一数据而不同步的问题。那么如果实现线程的同步呢?
线程的同步有多种实现方式:
互斥内核对象、事件内核对象、可等待的计数器内核对象、信号量内核对象和等待函数等等来实现线程的同步。
我们先用互斥内核对象实现线程同步。
互斥内核对象,能够确保线程拥有对单个资源的互斥访问权,互斥对象包含一个使用数量,一个线程ID和一个计数器。其中ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
使用CreateMutext函数,创建或打开一个互斥对象,然后利用互斥对象完成线程间的同步。
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTESl pMutexAttributes, // 指向安全属性的指针
BOOL bInitialOwner, // 初始化互斥对象的所有者
LPCTSTR lpName // 指向互斥对象名的指针
);
参数 类型及说明
lpMutexAttributes :
可以使用NULL,表示使用默认的安全性。
bInitialOwner:
表示互斥对象的初始拥有者。如果为真,创建这个互斥对象的线程获得该对象的所有权,否则,该线程不获得该互斥对象的所有权。