1、在以下两种情况下,线程之间需要相互通信:
1)、需要要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。
2)、一个线程需要要通知其他线程某项任务已经完成。
2、原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。
3、InterlockedExchangeAdd(&g_x,i);相当于g_x++,但是前者是原子操作,
能保证只有一个CPU去访问同一个内存地址,这是一个硬件控制。
4、InterlockedExchange(32位)和InterlockedExchangePointer(64位)会把第一个参数所指向的内存地址的当前值,
以原子方式替换为第二个参数指定的值。
5、两个原子操作函数
PLONG InterlockedCompareExchange(PLONG plDestination,LONG lExchange,LONG lComparand);
PLONG InterlockedCompareExchangePointer(PVOID *ppvDestination,PVOID pvExchange,PVOID pvComparand);
第一个参数与第三个的值比较,相当,就把第一个参数的值改为第二的值,不同,则保持不变(32位,64位)
6、LONG InterlockedIncrement(PLONG plAddend);
Long InterlockedDecrement(PLONG plAddend);这两个函数可以加减任何值
7、获取高速缓存行的大小,最简单的方法是调用Win32的GetLogicalProcessorInformation,该函数返回一个
SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构数组。我们可以检查每个结构的Cache字段,该成员是一个CACHE_DESCRIPTOR
结构,其中的LineSize字段表示CPU的高速缓存行
8、关键段,定义一个CRITICAL_SECTION的结构对象,然后把任何需要访问共享资源的代码放在EnterCriticalSection
和LeaveCriticalSection之间,调用两个函数的时候,传入的是g_cs的地址。关键段速度快,但是无法用来在多个进程
之间对线程进行同步。
9、在任何线程试图访问被保护的资源之前,必须对CRITICAL_SECTION结构的内部成员进行初始化,函数为:
InitializeCriticalSection(PCRITICAL_SECTION pcs);不再需要CRITICAL_SECTION后,可以使用
DeleteCriticalSection(PCRITICAL_SECTION pcs);来删除它。
10、在使用关键段的时候同时使用旋转锁,调用下面的函数来初始化
BOOL InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
第一个参数就不说了,第二个是我们希望旋转锁循环的次数。单处理器的话,dwSpinCount没有用。
SetCriticalSectionSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
11、SRWLock允许我们区分那些想要读取值的线程和写入值和线程,允许读取的值同时进行读取,但写入时,只允许单个
线程操作。
12、分配一个SRWLOCK结构并用InitializeSRWLock进行初始化,初始化完成后,
写入线程可以调用AcquireSRWLockExclusive将SRWLOCK对象的地址作为参数传入,以尝试获得对被保护的资源的独占访问权。
更新完成后,就可以调用ReleaseSRWLockExclusive来解除锁定,读取时调用下面两个函数,AcquiresSRWLockShared,
ReleaseSRWLockShared。其它的,系统会自动进行清理工作。
13、条件变量相关函数SleepConditionVariableCS、SleepConditionVariableSRW、WakeConditionVariable、WakeAllConditionVariable
1)、需要要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。
2)、一个线程需要要通知其他线程某项任务已经完成。
2、原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。
3、InterlockedExchangeAdd(&g_x,i);相当于g_x++,但是前者是原子操作,
能保证只有一个CPU去访问同一个内存地址,这是一个硬件控制。
4、InterlockedExchange(32位)和InterlockedExchangePointer(64位)会把第一个参数所指向的内存地址的当前值,
以原子方式替换为第二个参数指定的值。
5、两个原子操作函数
PLONG InterlockedCompareExchange(PLONG plDestination,LONG lExchange,LONG lComparand);
PLONG InterlockedCompareExchangePointer(PVOID *ppvDestination,PVOID pvExchange,PVOID pvComparand);
第一个参数与第三个的值比较,相当,就把第一个参数的值改为第二的值,不同,则保持不变(32位,64位)
6、LONG InterlockedIncrement(PLONG plAddend);
Long InterlockedDecrement(PLONG plAddend);这两个函数可以加减任何值
7、获取高速缓存行的大小,最简单的方法是调用Win32的GetLogicalProcessorInformation,该函数返回一个
SYSTEM_LOGICAL_PROCESSOR_INFORMATION结构数组。我们可以检查每个结构的Cache字段,该成员是一个CACHE_DESCRIPTOR
结构,其中的LineSize字段表示CPU的高速缓存行
8、关键段,定义一个CRITICAL_SECTION的结构对象,然后把任何需要访问共享资源的代码放在EnterCriticalSection
和LeaveCriticalSection之间,调用两个函数的时候,传入的是g_cs的地址。关键段速度快,但是无法用来在多个进程
之间对线程进行同步。
9、在任何线程试图访问被保护的资源之前,必须对CRITICAL_SECTION结构的内部成员进行初始化,函数为:
InitializeCriticalSection(PCRITICAL_SECTION pcs);不再需要CRITICAL_SECTION后,可以使用
DeleteCriticalSection(PCRITICAL_SECTION pcs);来删除它。
10、在使用关键段的时候同时使用旋转锁,调用下面的函数来初始化
BOOL InitializeCriticalSectionAndSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
第一个参数就不说了,第二个是我们希望旋转锁循环的次数。单处理器的话,dwSpinCount没有用。
SetCriticalSectionSpinCount(PCRITICAL_SECTION pcs,DWORD dwSpinCount);
11、SRWLock允许我们区分那些想要读取值的线程和写入值和线程,允许读取的值同时进行读取,但写入时,只允许单个
线程操作。
12、分配一个SRWLOCK结构并用InitializeSRWLock进行初始化,初始化完成后,
写入线程可以调用AcquireSRWLockExclusive将SRWLOCK对象的地址作为参数传入,以尝试获得对被保护的资源的独占访问权。
更新完成后,就可以调用ReleaseSRWLockExclusive来解除锁定,读取时调用下面两个函数,AcquiresSRWLockShared,
ReleaseSRWLockShared。其它的,系统会自动进行清理工作。
13、条件变量相关函数SleepConditionVariableCS、SleepConditionVariableSRW、WakeConditionVariable、WakeAllConditionVariable
303

被折叠的 条评论
为什么被折叠?



