zoukankan      html  css  js  c++  java
  • windows多线程同步总结

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

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

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

    线程的协同工作。

     

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

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

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

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

     

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

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

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

    窗口是不能再卖的

     

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

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

    关键区:

    1 CRITICALSECTION cs;创建关键区对象
    2 
    3 InitializeCriticalSection(&cs);初始化关键区
    4 
    5 EnterCriticalSection(&cs);进入关键区
    6 
    7 LeaveCriticalSection(&cs);离开关键区

     

    互斥对象:

    1 HANDLE Mu;定义互斥对象
    2 
    3 Mu=CreateMutex(.....);创建互斥对象
    4 
    5 WaitSingleObject();等待互斥对象激活
    6 
    7 ReleaseMutex();释放互斥对象的所有权

     

    事件对象:

    1 HANDLE Event;定义事件对象
    2 
    3 Event=CreateEvent();创建事件对象
    4 
    5 WaitSingleObject();等待事件对象激活
    6 
    7 ResetEvent();设置事件对象为无信号
    8 
    9 SetEvent();设置事件对象为有信号

     

    信号量:

    1 HANDLE  sem;定义信号量事件
    2 
    3 sem=CreateSemaphore();创建信号量事件
    4 
    5 WaitSingleObject();等待事件对象激活
    6 
    7 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()即可

  • 相关阅读:
    免费的视频、音频转文本
    Errors are values
    Codebase Refactoring (with help from Go)
    Golang中的坑二
    Cleaner, more elegant, and wrong(msdn blog)
    Cleaner, more elegant, and wrong(翻译)
    Cleaner, more elegant, and harder to recognize(翻译)
    vue控制父子组件渲染顺序
    computed 和 watch 组合使用,监听数据全局数据状态
    webstorm破解方法
  • 原文地址:https://www.cnblogs.com/vpoet/p/4686590.html
Copyright © 2011-2022 走看看