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

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

 //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. android 调用webview控件,为逆向h5app做准备

    activity对应layout文件加入: <WebView android:id="@+id/main_web" android:layout_width="ma ...

  2. cocos2d JS-(JavaScript) 基础语法运算符

    简单且逼格高的运算符 var a = 12; console.log(-a); //输出 -12 - -> 取反 var b = a++; console.log(b); //输出 12 - - ...

  3. Hibernate框架第一天

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

  4. gitlab8.2->8.16->8.17->9.0升级

    注:不要跨过8.16升级至8.17,这样做升级过程会报错 ###################################8.2升级至8.16########################## ...

  5. mint-ui Picker的使用

    <template> <div v-bind:style="{minHeight:clientHeight + 'px'}" id="recive-mi ...

  6. RSA解密解密

    #!/usr/bin/env python # -*- coding:utf-8 -*- import rsa import base64 # ######### 1. 生成公钥私钥 ######## ...

  7. 城市里的间谍B901

    城市里的间谍   城市里的间谍 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 某城市的地铁是线性的,有 n(2 <= n ...

  8. cmd强行终止进程

    找到某个进程对应的端口号 Netstat -ano|findstr  8080 通过ip 地址,强行    taskkill /PID 11048 但有的情况下终止不了,需要通过下列方式进行 task ...

  9. importlib

    Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外,importlib允许程序员创建他们自定义的对象,可用 ...

  10. python pymssql 连接数据库

    1)写在前面 远程连接数据库的时候,端口前面都是用的逗号, 因为惯性思维, 就傻傻的把    ip+,+端口 赋值给server了,然后一直报错, pymssql.InterfaceError: Co ...