core--线程同步(用户模式)
用户模式下的多线程同步只适用用于同一个进程内的多个线程,其范围使用于读写问题:比如一本书,必须是作者A写完之后,读者B才能够读取。否则作者一边修改,读者一边读,完全乱套。
线程读者B如何能在多线程环境下完成等待呢?请参看这里
那要等到什么时候呢?
LONG InterlockedExchange( //该函数将target变量的值
LPLONG Target, // 指向32位需要改变的变量的地址
LONG Value // 新值
); // 返回target变量的旧值
bool globeResource=False;
如果在多个线程中都调用如下代码,就能完成等待的效果
while(InterLockedExchange(globeResource,True))
Sleep(0);
//此处线程的其他真正任务代码
InterLockedExchange(globeResource,Flase)
“假如1个线程正在试用该值的话,那么globeResource就为true,当另外一个线程也开始执行,interlockedexchange函数就会返回true,从而进入sleep(0),也就是放弃该线程的时间片,立即切换到其他线程。当操作系统下一次调用,函数依然返回ture,依然sleep(0),这就是说线程一直都不继续执行下面的代码,从而完成了等待的效果,当第一个线程完成代码之后,globeResource就为false,那么第二个线程就会推出while循环,执行线程其他的代码。”
InterlockedExchange函数其实是windows原子访问家族中的一个。
什么是原子访问?请看下面代码:
int a=0;
a++;
这里的a++虽然只有一句话,但是在cpu级别会被解释为三句话;
mov eax,[a]
add eax
mov [a],eax
要保证这种加法是原子操作,也就是一部到位就要是用windows原子访问家族
windows原子访问家族
LONG InterlockedExchangeAdd (
PLONG Addend, // 指向需要被加的变量
LONG Increment // increment value
);
InterlockedExchangpointer
PVOID InterlockedCompareExchange(
PVOID *Destination, // pointer to the destination pointer
PVOID Exchange, // the exchange value
PVOID Comperand // the value to compare
);
更加优秀的同步
查看上面的代码,可以发现线程总是在执行,总是处于可调度状态,而不是等待状态:虽然是通过调用sleep来完成的等待,但是while循环在每次系统调用之后会执行一次,有没有直接让线程处于不可调度状态,并在等到响应的资源过后就然线程处于可调度状态呢?请看下面的例子
LPCRITICAL_SECTION g_cs;//进程全局变量
int index=0;
线程:
EnterCriticalSection(&g_cs);
index++;//在这里执行一大段需要同步的代码
LeaveCriticalSection(&g_cs)
VOID EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection // 指向资源的指针 );
VOID LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection // 指向资源的指针 );
通过上面的这对函数,就能够完成然线程进入等待状态,在其他线程释放g_cs之后,自动然线程变成可调度状态。但是在使用的时候一定要确保这两个函数成对出现,否则就像你进入厕所,不离开一样,别人就永远进不了!
EnterCriticalSection函数会让线程等待
TryEnterCriticalSection函数不会让线程等待,如果其他线程正在使用,那么函数就将直接返回false,否则返回True
当线程进入等待状态之后,也就是说线程从用户状态切换到内核状态了,这个切换会用掉cpu大概1000多个时钟周期,也就是说非常耗费系统,为了不进入内核状态,可以使用
initializecriticalsectionandspincount(&g_cs,spinCount) spinCount表示循环次数,相当于上面的wihle循环多少次
core--线程同步(用户模式)的更多相关文章
- 线程同步——用户模式下线程同步——Interlocked实现线程同步
线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...
- 线程同步——用户模式下线程同步——Slim读写锁实现线程同步
//Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...
- C#并行编程(6):线程同步面面观
理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...
- 内核模式下的线程同步的分析(Windows核心编程)
内核模式下的线程同步 内核模式下的线程同步是用户模式下的线程同步的扩展,因为用户模式下的线程同步有一定的局限性.但用户模式下线程同步的好处是速度快,不需要切换到内核模式(需要额外的 CPU 时间).通 ...
- .NET面试题解析(07)-多线程编程与线程同步
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...
- C#编程总结(三)线程同步
C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多 ...
- [转]C#编程总结(三)线程同步
本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...
- .NET面试题解析(07)-多线程编程与线程同步 (转)
http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...
- .net线程同步
大家都晓得.NET中线程同步有以下几种方式: 临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event) 1.临界区:通过对多线程的串行化来访问 ...
- C#线程同步(转)
线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不 ...
随机推荐
- CSS中常用的字体单位:px、em、rem和%的区别
在刚接触CSS时,px用的比较多,也很好理解,可是用久了就会发现有些缺陷,特别是在做响应式开发的时候. 那这么多单位到底在什么时候用什么单位合适呢?今天就来探讨一下. 先大致解释一下这些单位的意思: ...
- 用dedecms自定义表单创建简易自助预约系统
建站往往需要根据客户的需求来增加相应的功能,比如预约.平时用比较多的是织梦系统,那么如何用dedecms自定义表单创建简易自助预约系统呢? 进入dedecms后台,左侧菜单中依次点击“核心” - 频道 ...
- ubuntu学习之一
1终端 在右键后菜单中找到 终端,(如果没有终端,使用 Ctrl+Alt+[F1~F6] ,您可以切换到1~6号控制台,输入: sudo apt-get install nautilus-open-t ...
- mysql if条件
#if表达式 SELECT reg_no, IF(reg_no='718170554','黄色宾利','红色宾利') FROM car WHERE reg_no IN ('718170554','12 ...
- linux下命令行查看Memcached运行状态(shell)
stats查看memcached状态的基本命令,通过这个命令可以看到如下信息:STAT pid 22459 进程IDSTAT uptime 10 ...
- Ruby Profiler 详解之 ruby-prof(I)
项目地址: ruby-prof 在上一篇 Ruby 中的 Profiling 工具中,我们列举了几种最常用的 Profiler,不过只是简单介绍,这一次详细介绍一下 ruby-prof 的使用方法. ...
- VS2012 win7 修改TFS登陆账号
1.修改登陆账号: 在网上搜了好多,都没有找到解决方法,自己琢磨了一会找到了修改登陆TFS(Team Foundation Server)(团队资源管理器)的账号,和大家分享一下吧. 点击“开始”-- ...
- 分布式数据存储-MySQL主从复制
前言 一.主从复制过程 MySQL的主从复制能力是通过三个线程来实现的,两个在Slave端的I/O和SQL两个线程,还有一个在Master端I/O线程: Binlog dump thread:Mast ...
- POJ 3301 Texas Trip (三分)
题目链接 题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点.输出面积. 思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变. 正方形从 ...
- [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二
发布日期:2009.06.01 作者:Anytao © 2009 Anytao.com ,Anytao原创作品,转贴请注明作者和出处. Tuple,是函数式编程的概念之一,早见于Elang.F#等动态 ...