这些天,经过对OSG OpenThreads代码的学习,在OpenThreads模块中,重点介绍了线程的操作,例如,创建线程、挂起线程、限时挂起线程等。在OpenThreads模块中,有重要的三个类:Mutex类、Condition类、Barrier类、Thread类。
一、Mutex类: 互斥类,这个类提供了一个面向对象的线程互斥对象接口,在代码中,有两种方式实现,内存的互斥访问:(1)使用临界区 USE_CRITICAL_SAECTION (2)使用原子操作。
1.1. 在使用临界区时,首先需要定义一个临界区变量,并初始化,类实现所有的头文件为: windows.h, 代码所在的文件与类: Win32MutexPrivateData.h Win32MutexPrivateData Mutex, Win32Mutex.cpp
CRITICAL_SECTION _cs; InitializeCriticalSection(&_cs);
进入临界区后,实现对内存的互斥访问,访问完成后,离开临界区 : 实现线程的挂起与运行
EnterCriticalSection(&_cs); tryEnterCriticalSection(&_cs); LeaveCriticalSection(&_cs);
tryEnterCriticalSection(&_cs) 返回类型为布尔类型 如果为FALSE: 表示线程已经获取到该临界区,或者早已获取, 如果返回TRUE: 表示另外的线程获已经获取了该临界区变量。
在程序结束时,需要删除临界区:
DeleteCriticalSection(&_cs);
1.2. 使用原子操作实现内存互斥访问,(线程的运行与挂起);首先定义变量,并初始化, 类实现的头文件: windows.h 代码所在的文件与类: Win32MutexPrivateData.h Win32MutexPrivateData Mutex, Win32Mutex.cpp
volatile unsigned long mutex;; mutex = 0;
volatile 就象大家更熟悉的const一样,volatile是一个类型修饰符(type specifier)。它是被设计用来修饰被不同线程访问和修改的变量。
原子操作: 0.1互换操作