用户模式下的多线程同步只适用用于同一个进程内的多个线程,其范围使用于读写问题:比如一本书,必须是作者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--线程同步(用户模式)的更多相关文章

  1. 线程同步——用户模式下线程同步——Interlocked实现线程同步

    线程同步分为用户模式下的线程同步和内核对象的线程同步. 当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局 //1.利用原子访问: Interlocked系列函数,关于Interlocke ...

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

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

  3. C#并行编程(6):线程同步面面观

    理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...

  4. 内核模式下的线程同步的分析(Windows核心编程)

    内核模式下的线程同步 内核模式下的线程同步是用户模式下的线程同步的扩展,因为用户模式下的线程同步有一定的局限性.但用户模式下线程同步的好处是速度快,不需要切换到内核模式(需要额外的 CPU 时间).通 ...

  5. .NET面试题解析(07)-多线程编程与线程同步

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实是很多的,比如多线程编程.线程上下文.异步编程.线程同步构造.GUI的跨线程访问等等, ...

  6. C#编程总结(三)线程同步

    C#编程总结(三)线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多 ...

  7. [转]C#编程总结(三)线程同步

    本文转自:http://www.cnblogs.com/yank/p/3227324.html 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可 ...

  8. .NET面试题解析(07)-多线程编程与线程同步 (转)

    http://www.cnblogs.com/anding/p/5301754.html 系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 关于线程的知识点其实 ...

  9. .net线程同步

    大家都晓得.NET中线程同步有以下几种方式: 临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event) 1.临界区:通过对多线程的串行化来访问 ...

  10. C#线程同步(转)

    线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不 ...

随机推荐

  1. windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展(转)

    拓展安装调试方法: 编写调试php文件 <?php  memcache();  通过命令行执行测试,因为php拓展安装成功与否与apache无关,所以没必要不断重启apache去看phpinfo ...

  2. css两个form不换行,两个div并排代码

    1.form不换行通过table布局实现 <table> <tr> <td> <form method="get" action=&quo ...

  3. 由浅入深了解Thrift之客户端连接池化

    一.问题描述 在上一篇<由浅入深了解Thrift之服务模型和序列化机制>文章中,我们已经了解了thrift的基本架构和网络服务模型的优缺点.如今的互联网圈中,RPC服务化的思想如火如荼.我 ...

  4. HYSBZ2038 小Z的袜子(莫队算法)

    今天学了一下传说中的解决离线询问不修改的一种算法.题目的意思非常简单,就是询问在一个[L,R]区间里的取两个物品,然后这两个物品颜色相同的概率.其实就是对于每种颜色i,这个区间里对应的个数cnt[i] ...

  5. POJ 2566

    Bound Found Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1445   Accepted: 487   Spec ...

  6. flume-ng+Kafka+Storm+HDFS 实时系统搭建

    转自:http://www.tuicool.com/articles/mMrQnu7 一 直以来都想接触Storm实时计算这块的东西,最近在群里看到上海一哥们罗宝写的Flume+Kafka+Storm ...

  7. Linux网络编程9——对TCP与UDP的简易封装2.0

    具体生成动态库的操作及使用该动态库的操作请参见上篇博文.以下仅仅列出改进版本的代码. 代码 my_socket.h #ifndef __MY_SOCKET_H__ #define __MY_SOCKE ...

  8. 妙味课堂——HTML+CSS(第二课)

    常见标签——img标签 <img src="图片地址" alt="图片名"/> alt属性是图片名字,是给百度搜索引擎抓取使用的.也有当图片地址不正 ...

  9. WinDbg调试流程的学习及对TP反调试的探索

    基础知识推荐阅读<软件调试>的第十八章 内核调试引擎 我在里直接总结一下内核调试引擎的几个关键标志位,也是TP进行反调试检测的关键位. KdPitchDebugger : Boolean ...

  10. 配置sshd_config中的PermitRootLogin设置root登录或者禁止root登录

    在etc的sshd_config文件中,默认有PermitRootLogin no的配置,这个的意思是禁止root用户登录,如果想要允许root登录,需要su root用户到sshd_config下进 ...