线程同步分为用户模式下的线程同步和内核对象的线程同步。

 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局

 //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实现线程同步的更多相关文章

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

    //Slim读/写锁实现线程同步 SRWlock 的目的和关键段相同:对同一资源进行保护,不让其它线程访问. 但是,与关键段不同的是,SRWlock允许我们区分哪些想要读取资源的线程(读取者线程) 和 ...

  2. windows核心编程---第七章 用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

  3. 【windows核心编程】 第八章 用户模式下的线程同步

    Windows核心编程 第八章 用户模式下的线程同步 1. 线程之间通信发生在以下两种情况: ①    需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性 ②    一个线程需要通知其他线程 ...

  4. Windows核心编程:第8章 用户模式下的线程同步

    Github https://github.com/gongluck/Windows-Core-Program.git //第8章 用户模式下的线程同步.cpp: 定义应用程序的入口点. // #in ...

  5. 《windows核心编程系列》七谈谈用户模式下的线程同步

    用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在 ...

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

    8.6 条件变量(Condition Variables)——可利用临界区或SRWLock锁来实现 8.6.1 条件变量的使用 (1)条件变量机制就是为了简化 “生产者-消费者”问题而设计的一种线程同 ...

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

    Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...

  8. 在单用户模式下修改CentOS的root密码

    我们在使用CentOS的过程中可能会发生忘记root用户密码的情况,本文就从应用的角度简单介绍一下如何在单用户模式下修改root用户的密码. 开启CentOS,进入系统启动菜单 将光标停留在系统开机时 ...

  9. 设置GRUB密码以防止单用户模式下root密码被恶意更改

    在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...

随机推荐

  1. mac book docker

    mbp的某些方面还是挺有吸引力的啊 但工作中大多数用的还是纯linux而不是类unix的mac os,要在家里的mac os x 和linux之间转转弯,有时候想想还是挺别扭的. 为了从公司-> ...

  2. (转载)常用正则表达式大全!(例如:匹配中文、匹配html)

    正则匹配java注意点: 如果加 ^[\n]* 表示替换遇到 \n 的前后内容,如果加[\n]表示替换\n本处内容 原文地址:http://blog.csdn.net/dl020840504/arti ...

  3. 增删改(DML)操作

    增删改(DML)操作 1.1事务(transaction) 事务是数据库操作的最小单元,又ACID的特性,应该保证一个事务的sql语句要么同时成功,要么都不成功. Mybatis中配置了事务管理器,t ...

  4. Hibernate框架第一天

    **框架和CRM项目的整体介绍** 1. 什么是CRM * CRM(Customer Relationship Management)客户关系管理,是利用相应的信息技术以及互联网技术来协调企业与顾客间 ...

  5. MyBatis基础入门《四》接口方式.Select查询集合

    MyBatis基础入门<四>接口方式.Select查询集合 描述: 在<MyBatis基础入门<二>Select查询>中有说过,SQLSession有两种用法,这里 ...

  6. spark sql01

    package sql; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; i ...

  7. python将目录切换为脚本所在目录

    os.chdir(os.path.abspath(os.path.dirname(sys.argv[0])))

  8. tfs团队项目删除原来连接的默认账户

    1.在用visual studio 连接团队项目时,首次输入用户名和密码后,默认保存住凭据了,等以后连接会自动采用首次的凭证. 但是如何采用新的用户重新登录呢.如图所示,删除原有的凭证.删除后重启电脑 ...

  9. c#之根据出生日期获得星座信息

    星座定义如下: 代码如下: public enum Constellation { Aquarius = , // 水瓶座 1.20 - 2.18 Pisces = , // 双鱼座 2.19 - 3 ...

  10. Marlin 溫度感應器 數值轉換對應表

    Marlin 溫度感應器 數值轉換對應表   (2014/03/27)Update: 自己實測了這個自動產生的對應表,結果測得的溫度與實際值仍有相當大的誤差.看來還是要回頭用測量的方式來校正溫度... ...