线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步分为用户模式下的线程同步和内核对象的线程同步。 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快 //(1)首先是InterlockedExchangeAdd兄弟函数,
//第一个参数 Addend 代表进行操作数的地址,
//第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可 LONG InterlockedExchangeAdd(
LONG volatile *Addend,
LONG Value ) ; LONG InterlockedExchangeAdd64(
LONG64 volatile *Addend,
LONG64 Value );
//(2)还有其它3个Interlocked函数 LONG InterlockedExchange(
LONG volatile *Target,
LONG Value ) ; LONGLONG InterlockedExchange64(
LONG64 volatile *Target,
LONG64 Value ); PVOID InterlockedExchangePointer(
PVOID volatile *Target,
PVOID Value ); //InterlockedExchange 和 InterlockedExchangePointer
//会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值 //(3)最后的另个Interlocked交换函数
PLONG InterlockedCompareExchange(
LONG volatile *Destination,
LONG Exchange,
LONG Comperand ) ; PLONG InterlockedCompareExchangePointer(
PVOID volatile *Destination,
PVOID Exchange,
PVOID Comperand ) ;
//函数执行的伪代码
{
if (Destination == Comperand )
{
Destination = Exchange ;
}
}
//函数会将当前值Destination与参数Comparand进行比较,如果两个值相同,
//那么函数会将*Destination 修改为Exchange,否则Destination保值不变 //实现旋转锁时,InterlockedExchange及其有用
//下面演示一下旋转锁
BOOL g_fResourceInUse = FALSE ;
void Func1()
{
//等待接收资源
while(InterlockedExchange(&g_fResourceInUse,TRUE) == TRUE )
Sleep(); //接收资源 //我们不在需要接收资源
InterlockedExchange(&g_fResourceInUse,FALSE) ;
} #include "windows.h"
#include "iostream"
using namespace std;
long g_x = ; //定义线程函数1
DWORD WINAPI ThreadFunOne(PVOID pvParam) ; //定义线程函数2
DWORD WINAPI ThreadFunTwo(PVOID pvParam); int main()
{
//创建线程1
HANDLE hThreadOne = CreateThread(NULL,,ThreadFunOne,,,NULL);
CloseHandle(hThreadOne); //创建线程2
HANDLE hThreadTwo = CreateThread(NULL,,ThreadFunTwo,,,NULL);
CloseHandle(hThreadTwo); //让主线程先挂起,确保其它线程执行完成
Sleep();
cout<<g_x<<endl;
return ;
} DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
InterlockedExchangeAdd(&g_x,) ;
return ;
} DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
InterlockedExchangeAdd(&g_x,) ;
return ;
} 限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步
线程同步——用户模式下线程同步——Interlocked实现线程同步的更多相关文章
- 线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...
- windows核心编程---第七章 用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- 【windows核心编程】 第八章 用户模式下的线程同步
Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ① 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ② 一个线程需要通知其他线程 ...
- Windows核心编程:第8章 用户模式下的线程同步
Github https://github.com/gongluck/Windows-Core-Program.git //第8章 用户模式下的线程同步.cpp: 定义应用程序的入口点. // #in ...
- 《windows核心编程系列》七谈谈用户模式下的线程同步
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...
- 第8章 用户模式下的线程同步(4)_条件变量(Condition Variable)
8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...
- CentOS单用户模式下修改ROOT密码和grub加密
Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...
- 在单用户模式下修改CentOS的root密码
我们在使用CentOS的过程中可能会发生忘记root用户密码的情况,本文就从应用的角度简单介绍一下如何在单用户模式下修改root用户的密码. 开启CentOS,进入系统启动菜单 将光标停留在系统开机时 ...
- 设置GRUB密码以防止单用户模式下root密码被恶意更改
在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...
随机推荐
- AM自动化测试平台
AM自动化测试平台介绍: 最初目标:是为了做接口自动化测试,该平台,集成了,用例管理,测试执行,测试套件(主要为了应对,对场景业务流程有需要的),测试报告展示. 后期目标:适当增加,其它测试工具进行集 ...
- vue搭建环境并创建项目
1.>npm install @vue/cli -g 2.创建项目A a.>vue ui b.在弹出的管理界面创建项目 或 a.npm install -g @vue/cli-init b ...
- repr()函数
http://www.cnblogs.com/itdyb/p/5046415.html
- Redis Cluster(集群)的搭建
一.Redis的下载.安装.启动(单实例) 我们统一将Redis安装在/opt目录下,执行命令如下: $ cd /opt $ wget http://download.redis.io/release ...
- 10 enumerate()在字典,列表中的用法详解
1.字典 li = {"alex"," aric","Alex","Tony","rain"}for ...
- [博客迁移]探索Windows Azure 监控和自动伸缩系列3 - 启用Azure监控扩展收集自定义监控数据
上一篇我们介绍了获取Azure的监控指标和监控数据: http://www.cnblogs.com/teld/p/5113376.html 本篇我们继续:监控虚拟机的自定义性能计数器. 随着我们应用规 ...
- [openjudge-搜索]深度优先搜索之马走日
题目描述 描述 马在中国象棋以日字形规则移动.请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行 ...
- 关于JS的几个基础题目
1.截取字符串abcdefg的efg alert("abcdefg".substring(4)); 2.判断一个字符串中出现次数最多的字符,统计这个次数 var str = 'as ...
- mysql每天弹出窗口检测更新关闭方式...
右击计算机-->管理-->系统工具-->任务计划程序-->MySQL<如下图>,选中右键删除或者禁用即可... 更新分界线--------------------- ...
- 那个写书教你交易期权的人James Cordier爆仓了
那个写书教你交易期权的人James Cordier爆仓了 11月15日,James Cordier掌管的期权交易公司OptionSellers.com通过邮件告知投资者,其公司管理的账户遭遇了毁灭性的 ...