第八章 用户方式中线程的同步(1)

时间:2022-11-10 23:33:55

 

线程需要通信的情况:

当有多个线程访问共享资源而不使资源被破坏时。

当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。

原子访问:是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。

原子操作:指线程运行过程不中不发生中断。

1、互锁函数

互锁函数的执行方式与CPU平台相关, x 8 6 C P U,互锁函数会对总线发出一个硬件信号,防止另一个C P U访问同一个内存地址。

        LONG InterlockedExchangeAdd(PLONG plAddend, LONG Increment);

      将变量的值与指定的数相加后将变量值返回(只能为32位的值),返回该变量的值。plAddend传递一个变量地址Increment指定将变量的值增加多少。

        LONG InterlockedExchange(PLONG plTarget, LONG l Value);

        PVOID InterlockedExchangePointer(PVOID* ppvTarget, PVOID pvValue);

      以原子操作方式用第二个参数中传递的值来取代第一个参数中传递的当前值。InterlockedExchange只能用于32位应用程序而InterlockedExchangePointer可以用于32为和64位应用程序。

        InterlockedExchange在循环锁中很有用,应该保证将循环锁变量和循环锁保护的数据维护在不同的高速缓存行中。应该避免在单个C P U计算机上使用循环锁。

       PVOID InterlockedCompareExchange(PLONG plDestination, LONG lExchange,LONG lComparand);

       PVOID InterlockedCompareExchangePointer(PVOID* ppvDestination,

                                                                                     PVOID pvExchange, PVOID pvComparand);

       比较第三个参数与第一个参数指向的值是否相同,如果相同,那么用第二个参数取代第一个参数指向的值。如果不同,第一个参数的值保持不变。函数返回值为第一个参数所指的原始值。InterlockedCompareExchange只能用于32位应用程序而InterlockedCompareExchangePointer可以用于32为和64位应用程序。

将高速缓存行存储块中的和高速缓存行边界上的应用程序数据组合在一起(是确保不同的CPU能够访问至少由高速缓存行边界分开的不同的内存地址)。应该将只读数据(或不常读的数据)与读写数据分开。同时,应该将同一时间访问的数据组合在一起。