C++ Primer笔记(2)

关键段:
CRITICAL_SECTION g_cs;
EnterCriticalSection(&g_cs);
//加入访问共享资源的代码
LeaveCriticalSection(&g_cs);
由于关键段中使用了Interlocked函数,因此执行速度非常快。
最大的缺点在于它们无法用来在多个进程之间对线程进行同步。
一般把CRITICAL_SECTION结构作为全局变量来分配,这样进程中的所有线程就能够非常方便地通过这些变量名来访问这些结构。
在EnterCriticalSection前必须先调用InitializeCriticalSection对g_cs初始化,当不需要的时候,用DeleteCriticalSection来删除。
使用关键段比轮循的优势在于等待过程中不会浪费CPU时间。

关键段与旋转锁:
Q1:在使用关键段的同时,为什么要加旋转锁?
A1:当线程试图进入一个关键段,但这个关键段正被另一个进程占用的时候,函数会立即把调用线程切换到等待状态。这意味着
线程必须从用户模式切换到内核模式(大约要1000个CPU周期),这个切换的开销非常大。为了提高关键段的性能,Mircrosoft把旋转锁合并
到了关键段中。因此,当调用EnterCriticalSection的时候,它会用一个旋转锁不断地循环,尝试在一段时间内获得对资源的访问权。
只有当失败的时候,线程才会切换到内核模式并进入等待状态。
为了使用关键段的时候同时使用旋转锁,我们必须调用下面的函数来初始化关键段
BOOL InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
pcs----关键段地址,dwSpinCount----旋转锁尝试次数(单处理器的机器会忽略这个参数)
改变旋转次数:
DWORD SetCriticalSectionSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
自己可以尝试各种值,4000可做为一个参考。

你可能感兴趣的:(C++ Primer笔记(2))