原子锁

执行单个指令时,锁定操作,不允许其他线程访问.(循环执行原子锁运算时,循环过程中也是不允许其他线程访问,直到循环执行完原子操作)
    

原理介绍:

线程执行加减法时,依靠寄存器来计算,切换线程之前,先保存寄存器的值到线程中,再次轮到该线程执行时,把值恢复到寄存器中继续来计算。

问题描述:

想通过多线程执行g_nValue++的操作(即累加一个值),线程A通过寄存器完成加法运算,假设g_nValue正在加到10000时,线程切换到B,A的寄存器中保存10000数字,B从10000开始加数据,当B加到15000时,线程切换到A,A恢复寄存器的值,A会继续从10000开始累加,就将B完成5000的加法覆盖.

原子锁解决:

原子锁可以保证,在当前线程循环执行原子加/减操作时,其他线程不可以切换,直到当前线程原子操作循环执行完毕。

原子运算包括:

InterlockedIncrement ++运算

InterlockedDecrement --运算

InterlockedCompareExchange ?运算

// InterLock.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include "windows.h"LONG g_nValue1 = 0;
LONG g_nValue2 = 0;DWORD WINAPI InterProc1( LPVOID pParam )
{for( int nIndex=0; nIndex<10000000; nIndex++ ){  //普通++g_nValue1++;}return 0;
}
DWORD WINAPI InterProc2( LPVOID pParam )
{for( int nIndex=0; nIndex<10000000; nIndex++ ){  //原子锁++(lock)InterlockedIncrement( &g_nValue2 );}return 0;
}void Create( )
{DWORD  nThreadID  = 0;HANDLE hThread[4] = { NULL };hThread[0] = CreateThread( NULL, 0,InterProc1, NULL, 0, &nThreadID );hThread[1] = CreateThread( NULL, 0,InterProc1, NULL, 0, &nThreadID );hThread[2] = CreateThread( NULL, 0,InterProc2, NULL, 0, &nThreadID );hThread[3] = CreateThread( NULL, 0,InterProc2, NULL, 0, &nThreadID );WaitForMultipleObjects( 4, hThread, TRUE, INFINITE );printf( "Value1=%d  Value2=%d\n", g_nValue1, g_nValue2 );
}int main(int argc, char* argv[])
{Create( );return 0;
}

windows多线程同步机制---原子锁相关推荐

  1. windows系统多线程同步机制原理总结

    windows系统多线程同步机制原理总结 同步问题是开发过程中遇到的重要问题之一.同步是要保证在并发执行的环境中各个控制流可以有序地执行,包括对于资源的共享或互斥访问,以及代码功能的逻辑顺序. 为了保 ...

  2. Windows线程同步机制的区别与比较及进程通信方法

    原文:http://blog.csdn.net/eulb/article/details/2177500 多线程同步机制 (Windows) 线程的同步机制: 1.   Event 用事件(Event ...

  3. 一文搞定c++多线程同步机制

    c++多线程同步机制 前序文章:一文搞定c++多线程 同步与互斥 现代操作系统都是多任务操作系统,通常同一时刻有大量可执行实体,则运行着的大量任务可能需要访问或使用同一资源,或者说这些任务之间具有依赖 ...

  4. windows多线程同步--临界区

    推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS 关于临界区的观念,一般操作系统书上面都有. 适用范围:它只能同步一个进程中的线程,不能跨进程同步.一般用它来做单个进程内的代码快同步,效率比较 ...

  5. Java多线程同步机制

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  6. java线程同步机制有哪些_多线程同步机制包括哪些,java线程同步机制

    多线程同步机制包括哪些什么是多线程同步机制,多线程同步机制包括:1.临界段用于实现"独占占有":2.信号量用于跟踪有限的资源:3.互斥是核心对象,可以实现不同线程之间的" ...

  7. java线程同步机制有哪些_多线程同步机制包括哪些

    多线程同步机制包括:1.Critical Section用来实现"排他性占有":2.Semaphore被用来追踪有限的资源:3.Mutex是核心对象,可以在不同的线程之间实现&qu ...

  8. windows多线程同步互斥--总结

    2019独角兽企业重金招聘Python工程师标准>>> 秒杀多线程面试题系列 参考JustDoIT -- 大部分内容 <Windows核心编程>线程同步对象速查表 对象 ...

  9. Linux 多线程同步机制:互斥量、信号量、条件变量

    互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...

  10. 浅谈Java多线程同步机制之同步块(方法)——synchronized

    在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: 1 package com.jikexueyuan ...

最新文章

  1. MySQL 性能优化的 9 种姿势,面试再也不怕了!
  2. mysql中RAND()随便查询记录效率问题和解决的方法分享
  3. spring mvc返回json
  4. php 计时器microtime 以及去掉数组重复值array_unique
  5. flask mysql orm,flask的orm框架(Flask-SQLAlchemy)-创建表
  6. Spring框架学习笔记11:基于Java配置方式SSM框架西蒙购物网
  7. 音视频开发(35)---麦克风阵列语音增强
  8. 微信java创建菜单_微信自定义菜单的创建(JAVA版)
  9. MySQL 一张表中两个字段值互换
  10. 通过运用多线程来异步控制程序的运行
  11. [原]android解析pdf文件muPdf
  12. Quartus II13.0的破解过程
  13. Tarjan算法详解
  14. teraterm--一款超好用堪比MobaXterm的远程终端连接软件,能解决shell端tab键等自动补全命令功能的缺失问题
  15. QT 操作 QLabel
  16. android 换肤(1)——插件式无缝换肤(解析鸿洋大神的换肤流程)
  17. 西部数码 php 伪静态,西部数码虚拟主机伪静态如何设置
  18. 机器学习分享——反向传播算法推导
  19. HTTP协议详解由浅入深看HTTP
  20. signature=da0cbfb45ebebe4ea0118c0a20df185e,MS15-018:Internet Explorer 累积安全更新:2015 年 3 月 10 日...

热门文章

  1. python调用高德地图地理编码/逆地理编码
  2. 超越谷歌与特斯拉?百度Apollo生态有一套
  3. 大一上C语言复习3.填空题
  4. ad网络标号怎么用_altium designer网络标号的作用范围
  5. clc和clear命令的使用
  6. 踩坑系列《十一》完美解决阿里云vod视频点播无法播放音频和视频点播控制台里的媒资库里面的视频无法播放
  7. Windows系统快速修改IP地址的方法
  8. python PIL 将两个图片合成一张
  9. java 报‘java.net.UnknownHostException:错误
  10. 怎么发现愿景和目标 | 进击