线程同步——用户模式下线程同步——Interlocked实现线程同步

  1 线程同步分为用户模式下的线程同步和内核对象的线程同步。
  2
  3 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局
  4
  5
  6
  7
  8 //1.利用原子访问:  Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快
  9
 10 //(1)首先是InterlockedExchangeAdd兄弟函数,
 11 //第一个参数 Addend 代表进行操作数的地址,
 12 //第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可
 13
 14 LONG InterlockedExchangeAdd(
 15     LONG volatile *Addend,
 16       LONG Value ) ;
 17
 18 LONG InterlockedExchangeAdd64(
 19     LONG64 volatile *Addend,
 20     LONG64 Value );
 21 //(2)还有其它3个Interlocked函数
 22
 23 LONG InterlockedExchange(
 24     LONG volatile *Target,
 25     LONG Value ) ;
 26
 27 LONGLONG InterlockedExchange64(
 28     LONG64 volatile *Target,
 29     LONG64 Value );
 30
 31 PVOID InterlockedExchangePointer(
 32     PVOID volatile *Target,
 33     PVOID Value );
 34
 35 //InterlockedExchange 和 InterlockedExchangePointer
 36 //会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值
 37
 38 //(3)最后的另个Interlocked交换函数
 39 PLONG InterlockedCompareExchange(
 40 LONG volatile *Destination,
 41 LONG Exchange,
 42 LONG Comperand ) ;
 43
 44 PLONG InterlockedCompareExchangePointer(
 45 PVOID volatile *Destination,
 46 PVOID Exchange,
 47 PVOID Comperand ) ;
 48 //函数执行的伪代码
 49 {
 50 if (Destination == Comperand )
 51 {
 52 Destination = Exchange ;
 53 }
 54 }
 55 //函数会将当前值Destination与参数Comparand进行比较,如果两个值相同,
 56 //那么函数会将*Destination 修改为Exchange,否则Destination保值不变
 57
 58 //实现旋转锁时,InterlockedExchange及其有用
 59 //下面演示一下旋转锁
 60 BOOL g_fResourceInUse = FALSE   ;
 61 void Func1()
 62 {
 63     //等待接收资源
 64     while(InterlockedExchange(&g_fResourceInUse,TRUE) == TRUE )
 65         Sleep(0);
 66
 67     //接收资源
 68
 69     //我们不在需要接收资源
 70     InterlockedExchange(&g_fResourceInUse,FALSE) ;
 71 }
 72
 73
 74
 75 #include "windows.h"
 76 #include "iostream"
 77 using namespace std;
 78 long g_x = 0 ;
 79
 80 //定义线程函数1
 81 DWORD WINAPI ThreadFunOne(PVOID pvParam) ;
 82
 83 //定义线程函数2
 84 DWORD WINAPI ThreadFunTwo(PVOID pvParam);
 85
 86 int main()
 87 {
 88     //创建线程1
 89     HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
 90     CloseHandle(hThreadOne);
 91
 92     //创建线程2
 93     HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
 94     CloseHandle(hThreadTwo);
 95
 96     //让主线程先挂起,确保其它线程执行完成
 97     Sleep(10000);
 98     cout<<g_x<<endl;
 99     return 0 ;
100 }
101
102 DWORD WINAPI ThreadFunOne(PVOID pvParam)
103 {
104     InterlockedExchangeAdd(&g_x,1) ;
105     return 0;
106 }
107
108 DWORD WINAPI ThreadFunTwo(PVOID pvParam)
109 {
110     InterlockedExchangeAdd(&g_x,1) ;
111     return 0;
112 }
113
114
115 限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步

线程同步——用户模式下线程同步——Interlocked实现线程同步

时间: 2024-08-04 21:35:31

线程同步——用户模式下线程同步——Interlocked实现线程同步的相关文章

线程同步——用户模式下线程同步——Slim读写锁实现线程同步

1 //Slim读/写锁实现线程同步 2 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 3 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 4 和哪些想要更新资源值的线程(写入者线程).让所有读取者资源在同一时刻访问共享资源应该是 5 可行的,这是因为仅仅读取资源并不存在破坏数据的风险.只有当写入者线程想要对资源进行更新时才需要同步. 6 这种情况下,写入者线程应该独占资源访问权:任何线程,无论是读取还是写入者线程,都不许访问

线程同步——用户模式下线程同步——关键段实现线程同步

1 //2.使用关键段实现线程同步 2 使用时必须有以下几个步骤 3 //(1)必须先定义 CRITICAL_SECTION 结构 4 CRITICAL_SECTION g_cs; 5 //(2)初始化关键段 CRITICAL_SECTION 6 InitializeCriticalSection(&g_cs); 7 //(3)在线程中调用 8 DWORD WINAPI ThreadFunOne(PVOID pvParam) 9 { 10 EnterCriticalSection(&g_c

第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)

8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同步机制.其目的让线程以原子方式释放锁并将自己阻塞,直到某一个条件成立为止.如读者线程当没有数据可读取时,则应释放锁并等待,直到写者线程产生了新的数据.同理,当写者把数据结构写满时,那么写者应该释放SRWLock并等待,直到读者把数据结构清空. (2)等待函数:SleepConditionVariab

CentOS单用户模式下修改ROOT密码和grub加密

Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时,就需要进入单用户模式或修复模式对系统进行管理了. 使用单用户模式有一个前提,就是您的系统引导器(grub)能正常工作,否则要进行系统维护就要使用修复模式. 特注:进入单用户模式,没有开启网络服务,不支持远程连接 Linux 系统中不同的运行级别(Run Level)代表了系统的不同运行状态,例如

单用户模式下mount -o remount,rw / 有大用途

我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命令:mount –o remount,rw / 这个命令来让我们的/路径文件系统为可读模式,这样就可以实现自由修改了. 例如: 增加了/etc/mtab /dev/sdb1 /install ext3 rw 0 0 /etc/fstab LABEL=/install /install ext3 de

单用户模式下必用mount -o remount,rw /

我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可.但是在进入单用户模式后,/文件系统是只读模式,任何用户都无法进行修改,那么这个时候我们就需要用到一条命令:mount -o remount,rw / 这个命令来让我们的/文件系统为可读可写模式,这样就可以实现自由修改了.

RHEL&CentOS 6.x 单用户模式下增添密码保护

操作环境: 最小化安装的32位CentOS 6.4 1.备份 #cp /etc/sysconfig/init /etc/sysconfig/init.backup 2.添加密码保护命令 #sed -i 's/SINGLE=\/sbin\/sushell/SINGLE=\/sbin\/sulogin/' /etc/sysconfig/init RHEL&CentOS 6.x 单用户模式下增添密码保护

Windows核心编程笔记(6)----用户模式下的线程同步

1.原子锁 使用InterlockedExchangeAdd函数来实现原子增长,InterlockedExchange\InterlockedExchangePointer用来交换两个变 量的值,InterlockedCompareExchange对比数值,相等则交换(对应的InterlockedCompareExchangePointer).对应的 还有64位函数. InterlockedIncrement\InterlockedDecrement是比较老的函数,只能增加或递减1,Interl

第8章 用户模式下的线程同步(3)_Slim读写锁(SRWLock)

8.5 Slim读/写锁(SRWLock)——轻量级的读写锁 (1)SRWLock锁的目的 ①允许读者线程同一时刻访问共享资源(因为不存在破坏数据的风险) ②写者线程应独占资源的访问权,任何其他线程(含写入的线程)要等这个写者线程访问完才能获得资源. (2)SRWlock锁的使用方法 ①初始化SRWLOCK结构体 InitializeSRWLock(PSRWLOCK pSRWLock); ②写者线程调用AcquireSRWLockExclusive(pSRWLock);以排它方式访问   读者线