临界区现实同步互斥
来源:互联网 发布:全友家具靠谱吗 知乎 编辑:程序博客网 时间:2024/05/22 00:53
除了临界区对象进能够被用于一个进程内的线程使用外,临界区对象同于其他互斥体对象一样,也可以提供同步机制.事件,互斥体和信号量对象
也能够被用于单个进程实现资源互斥访问,与此相比,为了实现同步互斥访问共享资源,临界区对象提供一种更加轻巧,快速和有效的机制.象互斥
体对象一样,临界区对象也可以被一个使用它来阻止同步访问共享资源的线程所用于.例如:一个进程随时可以使用一个临界区对象来阻止其他线
程修改一个局数据结构.
进程负责为一个临界区分配内存.典型地,就是宣布一个CRITICAL_SECTION类型的变量.线程在使用它之前,临界区对象必须使用
InitializeCriticalSection函数进行初始化.线程使用EnterCriticalSection或TryEnterCriticalSection函数获取临界区所有权,并通过
LeaveCriticalSection函数释放临界区所用权.如果当前临界区对象被其他线程所拥有,EnterCriticalSection将无限等待为了临界区所有权.相
比之下,一个互斥体对象为了互斥,等待函数会有一个指定的时间段.TryEnterCriticalSection函数无阻塞正在调用的线程而进入临界区.
一旦线程拥有临界区,它必须额外的调用EnterCriticalSection或无阻塞他的执行的TryEnterCriticalSection函数.这样以来,当等待一个已存
在的临界区的拥有权时,就不会出现死锁自己.每当它进入临界区时,就必须调用LeaveCriticalSection来释放对临界区的拥有权.
当临界区被初始化之后,进程内的任一个线程都可以调用DeleteCriticalSection函数来释放被分配了的系统资源.DeleteCriticalSection函数
被调用之后,这个临界区对象就不能够再被拥有为了同步机制了.
一旦一个临界区对象被特有化之后,通过调用EnterCriticalSection函数而关联度其它的线程将等待为了它的拥有权.没有等到拥有权的线程释
放去继续运行.
SECTICAL_SECTION结构:
typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
//
// The following three fields control entering and exiting the critical
// section for the resource
//
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread; // from the thread's ClientId->UniqueThread
HANDLE LockSemaphore;
ULONG_PTR SpinCount; // force size on 64-bit systems when packed
} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
typedef RTL_CRITICAL_SECTION CRITICAL_SECTION;
typedef PRTL_CRITICAL_SECTION PCRITICAL_SECTION;
typedef PRTL_CRITICAL_SECTION LPCRITICAL_SECTION;
操作临界区的相关函数
(1) InitializeCriticalSection
初始化一个临界区对象,而临界区对象(数据成员)由系统自动维护.
VOID InitializeCriticalSection(
LPCRITICAL_SECTION lpCriticalSection //pointer to critical section object
);
(2) DeleteCriticalSection
释放一个没有被占有的临界区对象的所有资源.
VOID DeleteCriticalSection(
LPCRITICAL_SECTION lpCriticalSection //pointer to critical section object
);
(3) EnterCriticalSection
用来等待临界区对象的所有权,当调用线程赋予所有权,本函数返回,如果没能等待到,那么导致线程暂停.
VOID EnterCriticalSection(
LPCRITICAL_SECTION lpCriticalSection //pointer to critical section object
);
(4) LeaveCriticalSection
释放指定临界区对象所有权
void LeaveCriticalSection(
LPCRITICAL_SECTION lpCriticalSection //pointer to critical section object
);
例子:
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/3_program/c++/cppjs/20071018/78037.html
- 临界区现实同步互斥
- 临界区实现线程同步互斥
- C++ 临界区 多线程同步互斥
- C++ 临界区 多线程同步互斥
- 互斥同步-临界区,互斥量,信号量,事件的区别
- 线程同步机制有临界区、互斥、信号量优缺点
- 进程、线程同步互斥学习 —— 临界区
- 线程同步-临界区、互斥对象、事件对象区别
- 同步互斥,信号量,互斥量,事件,临界区
- Delphi线程同步(临界区、互斥、信号量)
- 多线程同步方法:临界区、事件、信号量、互斥对象
- 线程同步的三种方法(互斥,事件,临界区) 之一 使用临界区对象
- 临界区,互斥,信号量
- 临界区,互斥,信号量
- 临界区,互斥,信号量
- 临界区、互斥、信号量
- 进程同步的基本概念:临界资源、同步和互斥
- 线程同步的三种方法(互斥,事件,临界区) 之三 使用事件对象
- SU - Authentication failure
- Spring操作数据库
- 转ANSI编码转UTF8编码 实现代码
- sqlite中的lock
- strcpy and strncpy
- 临界区现实同步互斥
- String,CString,TCHAR,char之间区别和联系
- 数据库引擎优化顾问及简单使用
- TCHAR 与 STD::string 之间的若干问题
- c、c++在定义变量,数组时的内存布局及内存字节对齐
- c++ 静态成员 分配回收空间
- AutoPilot高层次综合C算法设计技巧-移位寄存器
- CString、TCHAR*、char*转换
- [转]如何有效的使用C#读取文件