基于临界区的线程同步
来源:互联网 发布:笑郭网络验证通杀 编辑:程序博客网 时间:2024/05/21 00:48
Windows操作系统提供了设定“特殊事件”的方法,就是使用同步对象。我将在今后学习常用的四种同步对象:临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件(Event)。
上述四种同步对象,除了临界区外都是内核对象。临界区不被操作系统的低级部件管理,而且不能使用句柄来操纵,是最易于使用和理解的同步对象。临界区工作在用户方式下,速度较快,但是容易进入死锁。
当多个线程共享对同一数据的访问时,线程之间可能会有干扰。一个临界区对象保护一段代码不被多于一个线程访问。在所有的同步对象中,临界区是最容易使用的,但是,一个临界区对一个进程或DLL是有限的,不能被其他进程共享,只能用于同步单个进程中的线程。临界区不是Windows核心对象,它和核心对象不同,存在于进程的内存空间中。
Win32 API提供了几个临界区函数:
void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);
CRITICAL_SECTION类型的变量用来扮演红绿灯的角色,让同一个时间内只有一个线程进入临界区。该临界区变量的声明必须是全局的,这样不同的线程就能访问它。操纵临界区的Win32函数初始化和维护该结构中的所有成员,不要自己去访问和修改任何成员。
使用临界区之前,必须调用InitializeCriticalSection()函数来初始化临界区。而通过调用EnterCriticalSection()函数来取得一个临界区的所有权。然后通过LeaveCriticalSection()函数来释放所有权。临界区通过一个线程取得所有权来显示它已经进入代码临界区的方法进行工作,如果其他线程调用EnterCriticalSection()并引用同一临界区,它会被阻塞,直到第一个线程调用LeaveCriticalSection()函数。最后,可以调用DeleteCriticalSection()函数来释放用户初始化临界区时分配的系统资源。
下面有个具体的应用例子:
#include <iostream>#include "windows.h"using namespace std;DWORD WINAPI funpro1(LPVOID lpParenrer);DWORD WINAPI funpro2(LPVOID lpParenter);int time = 0 ;CRITICAL_SECTION critical;int main(){HANDLE handle1,handle2;handle1 = CreateThread(NULL,0,funpro1,NULL,0,NULL);handle2 = CreateThread(NULL,0,funpro2,NULL,0,NULL);CloseHandle(handle1);CloseHandle(handle2);InitializeCriticalSection(&critical);Sleep(3000);DeleteCriticalSection(&critical);system("pause");return 0;}DWORD WINAPI funpro1(LPVOID lpParenrer){while (1){EnterCriticalSection(&critical);if (time<=20){cout<<"子线程1:"<<time++<<endl;}else break;LeaveCriticalSection(&critical);}return 0;}DWORD WINAPI funpro2(LPVOID lpParenter){while (1){EnterCriticalSection(&critical);if (time<=20){cout<<"子线程2:"<<time++<<endl;}else break;LeaveCriticalSection(&critical);}return 0;}
- 基于临界区的线程同步
- 基于临界区的线程同步
- 线程同步-临界区
- 线程同步-临界区
- 线程的同步(一)---临界区
- 线程同步:临界区的使用
- 线程同步之临界区
- 线程同步之临界区
- 线程同步之一:临界区
- 线程同步--临界区技术
- VC 线程同步 临界区
- 线程同步-临界区对象
- delphi 线程同步 临界区
- 线程同步之临界区
- 线程同步-临界区对象
- C++【线程同步】-临界区同步
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- gSoap使用入门(2)----自定义接口头文件
- 1180: 调用的方法 addFrameScript 可能未定义。
- Trie树:应用于统计和排序
- SQLITE BLOB二进制文件读取
- sharepoint小问题
- 基于临界区的线程同步
- 从web.config中读取AppSettings和connectionStrings信息
- android listview 取消头部分割线
- Converting a List to a DataTable
- TransparentBlt、StretchBlt与BitBl 的区别
- Java问题解析:到底创建了几个String对象?
- Origin null is not allowed by Access-Control-Allow-Origin.
- Day02第二天java基础
- 伤感日志_茫茫天涯走遍,寂寞心酸