设为首页 收藏本站
查看: 1009|回复: 0

《Windows核心编程》学习笔记(8)– 用户模式下的线程同步

[复制链接]

尚未签到

发表于 2015-5-23 13:15:39 | 显示全部楼层 |阅读模式
原子访问:Interlocked系列函数
  
  所谓原子访问,指的是一个线程在访问某个资源的同时能够保证没有其他线程会在同一时刻访问同一资源。

LONG InterlockedExchangeAdd(
            LONG volatile* Addend,
            LONG Value
);
LONGLONG InterlockedExchangeAdd64(
           LONGLONG volatile* Addend,
           LONGLONG Value
);
  上面两个函数:
  参数Addend 为要递增或者递减的变量的地址
  参数Value
为增量值,可以为负数,表示前一个变量参数递减。
  
  

LONG InterlockedExchange(
          LONG volatile* Target,
          LONG Value
);
LONGLONG InterlockedExchange64(
          LONGLONG volatile* Target,
          LONGLONG Value
);
PVOID InterlockedExchangePointer(
          PVOID volatile* Target,
          PVOID Value
);
  上面三个函数会把第一个参数指向的内存地址的当前值,以原子的方式替换为第二个参数指定的值。
  
  

LONG InterlockedCompareExchange(
          LONG volatile* Destination,
          LONG Exchange,
          LONG Comparand
);
PVOID InterlockedCompareExchangePointer(
          PVOID volatile* Destination,
          PVOID Exchange,
          PVOID Comparand
);
  上面这两个函数以原子的方式执行一个测试和设置操作。
  函数会将参数Destination
指向的当前值与参数Comparand
的值进行比较。如果两个值相同,那么函数会将 *Destination 修改为Exchange 参数的值。否则,*Destination的值保持不变。函数会返回
*Destination 原来的值。
  
  除了可以对整数或者布尔值进行这些原子操作外,我们还可以使用一系列的其他函数来对一种被称为Interlocked单项链表的栈进行操作。
  InitializeSListHead                      创建一个空栈  
  InterlockedPushEntrySList
         在栈顶添加一个元素
  InterlockedPopEntrySList
               移除位于栈顶的元素并将它返回
  InterlockedFlushSList
               清空栈
  QueryDepthSList                          返回栈中元素的数量
  
  

关键段
  关键段是一小段代码,它在执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行控制。当然,系统仍然可以暂停当前线程去调度其他线程。但是,在当前线程离开关键段之前,系统是不会去调度任何想要访问同一资源的其他线程。
  
  代码如下:



#include
#include
const int COUNT = 10;
int g_nSum = 0;
//定义CRITICAL_SECTION 结构

CRITICAL_SECTION g_cs;
DWORD WINAPI ServerThread1(PVOID pvParam)
{
       //开始对共享资源的访问

       EnterCriticalSection(&g_cs);
       g_nSum = 0;
       for(int n = 1; n

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-69854-1-1.html 上篇帖子: windows 8 Metro 设置选中ListViewItem 的样式 下篇帖子: windows 8 下 TortoiseSVN 图标无法正常显示
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表