Win32多线程同步方法

来源:互联网 发布:seo案例分析 编辑:程序博客网 时间:2024/05/05 13:19

       因为最近要做多线程方面的工作, 用到多线程的内容, 而网上搜了不少都是一些没什么用, 零零散散的内容, 根本没有系统和可学性. 看了<<Win32多线程程序设计>>对于在windows32平台上的多线程编程, 有很好的指导作用.
       下面先说一下线程同步的几种方法:(如果看不懂下面术语的话,先看一些基本书籍, 最好看看MSDN)

        1. Interlocked系列函数: 是一系列原子操作. 如果只是对单个32位变量进行增减, 交换等简单操作, 这个系列函数再合适不过了. 简单,高效.
        2. Critical Section: 这是一个用户模式下的局部同步变量, 不是内核对象, 可以锁定单个操作, 速度比较快. 因其不是内核对象, 不能命名, 不能用在进程间通信. 不能使用wait系列函数进行等待(当然就不能等待多个了).
        3. Mutex: 互斥内核对象, 使用Create系列函数创建, 使用wait系列函数等待资源变量. 可以命名,可以用在进程间通信. 其锁定操作花费是Critical Section 的100倍以上. 如果是线程内通信,并且不用等待多个资源变量, 基本用不上mutex, 因为Critical Section足够解决问题.
        4. Semephore: 信号量内核对象, 使用Create系列函数创建, 使用wait系列函数等待资源. 是针对存在多份资源控制的有效方法. 具有内核对象的其他性质.
        5. Event: 事件内核对象, 具有其他内核对象的性质, 分手动重置事件和自动重置事件. 一般用来进行线程间通知: 比如, 子线程结束, 通知主线程; 主线程需要暂停子线程;等情况.
在Win32的C++层面, 就上面五种,没其他了,同步就这几种方法,看似简单,其实大有学问. 接下来有时间一个一个展开分析.

        还有其他一些基本的概念与注意事项:
Interlocked系列函数是原子操作, 如InterlockedIncrement(i)使i增加1;  但 i++ 不是原子操作. 如果问为什么? 因为i++在执行时需要分解成多个指令级操作, 可能会因为中断产生而造成数据不同步. 具体情况就不讨论了.
        主线程开启了子线程, 一般情况下不等子线程结束是错误的做法. 除非用堆空间变量, 但这也不见得是一个好的方法, 还是老实等子线程结束, 或者限时等待放弃子线程.
        不要在子线程内调用 busy loop 和 wati...()函数. 

原创粉丝点击