1.多线程同步与多线程互斥的关系

其实这也是我一直困扰的问题,在这里我只是说说我的理解。我的理解是多线程互斥是针对于多线程资源而言的。

而多线程同步是针对于多线程时序问题。由于线程的并发性导致其运行时间的不确定性,所以我们需要控制多个

线程的协同工作。

还是举卖票的例子来区别互斥和同步的区别吧:

比如我们有两个窗口进行卖票,当然这里就需要一个全局变量来计数当前卖了第几张票了,最重要的是一张票不能

卖出去两次,所以当窗口1在卖第N张票的时候,窗口2应该就不能卖第N张票,否则当不进行互斥的时候,两个窗口

就可能出现卖出去同一张票。所以两个卖票的窗口卖票的过程是一个互斥的过程。

对于同步,我们可以举这样一个卖票的例子,当有两个卖票的窗口交替的进行卖票。每个窗口买一个小时。那么当

第一个窗口卖了一个小时之后告诉第二个窗口你该开始卖了,当第二个窗口卖了一个小时后又会通知第一个窗口你别

休息了快继续卖票了。当然我们不难发现在这一过程中自然的包含了互斥的过程,因为当第一个窗口卖过的票第二个

窗口是不能再卖的

不知道我说清楚没有,我的感觉了线程同步的过程其实就包含了线程互斥。线程互斥是一种特殊的线程同步情况。

2.关键区,互斥对象,事件对象,信号量的总结

关键区:

 CRITICALSECTION cs;创建关键区对象

 InitializeCriticalSection(&cs);初始化关键区

 EnterCriticalSection(&cs);进入关键区

 LeaveCriticalSection(&cs);离开关键区

互斥对象:

 HANDLE Mu;定义互斥对象

 Mu=CreateMutex(.....);创建互斥对象

 WaitSingleObject();等待互斥对象激活

 ReleaseMutex();释放互斥对象的所有权

事件对象:

 HANDLE Event;定义事件对象

 Event=CreateEvent();创建事件对象

 WaitSingleObject();等待事件对象激活

 ResetEvent();设置事件对象为无信号

 SetEvent();设置事件对象为有信号

信号量:

 HANDLE  sem;定义信号量事件

 sem=CreateSemaphore();创建信号量事件

 WaitSingleObject();等待事件对象激活

 ReleaseSemaphore();信号量对象计数加1

3.对于这种线程同步方式的区别:

1.关键区属于用户态对象,而其他三种是内核态的对象。所以使用关键区的效率较其他三种高,因为其他三种在使用的时候会进入内核态

2.关键区和互斥对象类似,主要解决资源的互斥访问。而关键区仅能用于线程同步,而互斥对象可以用于进程同步

3.事件对象主要用于线程的时序同步,比如一个线程结束了通知另外一个线程工作

4.而信号量主要用于生产者消费者问题。比如,厨房有四个碗,但是这时候有10个人要吃饭,那么在同一时刻最多只能由四个人同时吃饭。

此时可把信号量对象的计数最大值设为4.

 

4.关于CreateThread()和_beginthread()函数的区别:

参考MoreWindows大神的博文:http://blog.csdn.net/morewindows/article/details/7421759用一句话说起区别就是:CreateThread()

创建的线程没有考虑调用C运行库函数导致的数据覆盖问题而_beginthread()在创建的时候自动为每个线程维护一块内存供有需要的C运行库

函数。然而在底层_beginthread()实际上仍然是调用Createthread()

5.关于CreateThread()创建线程会执行两次:

最好在调用的时候不立即执行线程,设为为CREATE_SUSPEND然后再ResumeThread()即可

windows多线程同步总结的更多相关文章

  1. 总结windows多线程同步互斥

    windows多线程同步互斥--总结 我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同 ...

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

    我的windows多线程系列文章: windows多线程--原子操作 windows多线程同步--事件 windows多线程同步--互斥量 windows多线程同步--临界区 windows多线程同步 ...

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

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

  4. Windows多线程同步系列之二-----关键区

    关键区对象为:CRITICAL_SECTION 当某个线程进入关键区之后,其他线程将阻塞等待,知道该线程释放关键区的拥有权. 关键区同步主要有以下几个API 初始化关键区对象,无返回值,传入一个关键区 ...

  5. Windows多线程同步系列之一-----互斥对象

    多线程同步之互斥对象 作者:vpoet mail:vpoet_sir@163.com   对卖票问题进行线程间同步,本文将在上文的基础上,使用互斥对象对线程进行同步. 首先看看windows API ...

  6. windows多线程同步

    概述 任何单个应用程序都不能完全使该处理器达到满负荷.当一个线程遇到较长等待时间事件时,同步多线程还允许另一线程中的指令使用所有执行单元.例如,当一个线程发生高速缓存不命中,另一个线程可以继续执行.同 ...

  7. windows多线程同步--事件

    推荐参考博客:秒杀多线程第六篇 经典线程同步 事件Event   事件是内核对象,多用于线程间通信,可以跨进程同步 事件主要用到三个函数:CreateEvent,OpenEvent,SetEvent, ...

  8. windows多线程同步--互斥量

    关于互斥量的基本概念:百度百科互斥量 推荐参考博客:秒杀多线程第七篇 经典线程同步 互斥量Mutex 注意:互斥量也是一个内核对象,它用来确保一个线程独占一个资源的访问.互斥量与关键段的行为非常相似, ...

  9. windows多线程同步--信号量

    推荐参考博客:秒杀多线程第八篇 经典线程同步 信号量Semaphore   首先先介绍和windows信号量有关的两个API:创建信号量.释放信号量   HANDLE WINAPI CreateSem ...

随机推荐

  1. openstack组件手动部署整合

    preface:当你完全且正确的配置好整个OpenStack ENV 你将能看到的和体验到的!!! 我们先来看看简单效果吧,祝君能在这条路上走的更远,更好;

  2. n%i之和

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1168 题意:给定一个n,注意这里n小于10^12,求 分析:早些时 ...

  3. <PHP>字符串处理代码

    字符串处理:        strlen("aaa");取字符串的长度 ***    strcmp("aaa","aaa");比较两个字符串 ...

  4. 第27讲 UI组件之 ScrollView与底部动态添加数据

    第27讲 UI组件之 ScrollView与底部动态添加数据 1. ScrollView(滚动视图) ScrollView(滚动视图)是实现滚动的一个控件,只需要将需要滚动的控件添加到ScrollVi ...

  5. C++类訪问控制及继承

    一.C++类的訪问控制有三类:public,protected和private. 类訪问控制符 类成员可被哪些对象訪问 public 1.类的成员函数.2.类对象.3.友元.4.子类成员函数 prot ...

  6. openssl 证书请求和自签名命令req详解

    1.密钥.证书请求.证书概要说明 在证书申请签发过程中,客户端涉及到密钥.证书请求.证书这几个概念,初学者可能会搞不清楚三者的关系,网上有的根据后缀名来区分三者,更让人一头雾水.我们以申请证书的流程说 ...

  7. Gstreamer 中的playback插件

    1. PLAYBACK插件基本介绍 在早期的版本中同时存在playbin和playbin2,但是在最新的版本中,playbin2已经稳定,取代了playbin, playbin不再进行维护.下面是官网 ...

  8. 通过JS控制textarea的输入长度

    废话不多说,直接上代码(因为自己也只是遇到的时候然后上网查到的解决办法,放在此处只是为了方便各位看以及以后再碰到用起来方便) <ul> <li> <textarea ro ...

  9. DBHerperl类

    using System; using System.Collections.Generic; using System.Text; using System.Data; using System.D ...

  10. UI基础视图----UIScrollView总结

    UIScrollView是UIKit框架下的很重要的视图类,是UIView的子类.UILabel,UIImageView,UIWebView分别用于展示文字,图片,网页,UILabel通过属性text ...