多线程编程之一:关键段的使用
2017-07-27 21:35
190 查看
用下面这段代码说明多线程同步中“关键段”的使用:
转:所谓的“关键段”一般称为临界区,是实现进程内多线程互斥的常用方法。所谓“争夺关键段”就是一个线程以进入临界区(尚未离开),而又有其它线程要进入临界区。在首次发生“争夺”时,程序会自动创建一个内核事件,并等待该事件状态,当前一个线程离开临界区时会设置该事件通知正在等待的线程。若再次发生“争夺”,则利用前面已经创建的内核事件,无须再创建。等待和设置内核对象需要的时间较长,而很多情况下,线程间并不会出现“争夺关键段”的情况,所以利用临界区实现线程互斥比直接使用内核事件效率高。
#include "stdafx.h" #include <windows.h> #include <process.h> #include <iostream> using namespace::std; const int COUNT = 1000; int g_nSum = 0; CRITICAL_SECTION g_cs; unsigned int __stdcall FirstThread(PVOID pvParam) { EnterCriticalSection(&g_cs); g_nSum = 0; for (int n = 1; n <= COUNT; n++) { cout << "--------------add in FirstThread-------------\n" << endl; g_nSum += n; } LeaveCriticalSection(&g_cs); return(g_nSum); } unsigned int __stdcall SecondThread(PVOID pvParam) { EnterCriticalSection(&g_cs); g_nSum = 0; for (int n = 1; n <= COUNT; n++) { cout << "--------------add in SecondThread-------------\n" << endl; g_nSum += n; } LeaveCriticalSection(&g_cs); return(g_nSum); } int main() { InitializeCriticalSection(&g_cs); HANDLE h1, h2; h1 = (HANDLE)_beginthreadex(NULL, 0, FirstThread, NULL, 0, NULL); h2 = (HANDLE)_beginthreadex(NULL, 0, SecondThread, NULL, 0, NULL); WaitForSingleObject(h1, INFINITE); WaitForSingleObject(h2, INFINITE); cout << g_nSum << endl; DeleteCriticalSection(&g_cs); return 0; }
转:所谓的“关键段”一般称为临界区,是实现进程内多线程互斥的常用方法。所谓“争夺关键段”就是一个线程以进入临界区(尚未离开),而又有其它线程要进入临界区。在首次发生“争夺”时,程序会自动创建一个内核事件,并等待该事件状态,当前一个线程离开临界区时会设置该事件通知正在等待的线程。若再次发生“争夺”,则利用前面已经创建的内核事件,无须再创建。等待和设置内核对象需要的时间较长,而很多情况下,线程间并不会出现“争夺关键段”的情况,所以利用临界区实现线程互斥比直接使用内核事件效率高。
相关文章推荐
- 使用pthread库进行多线程编程2 - UNIX高级环境编程第12章读书笔记
- Java多线程编程核心技术(第四章Lock的使用)
- 使用pthread库进行多线程编程2 - UNIX高级环境编程第12章读书笔记
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- nodejs中使用多线程编程的方法实例
- 使用OpenCV和多线程编程实现摄像头实时播放
- Java多线程编程--(4)ThreadLocal的使用
- Android开发之多线程编程Thread和Runnable使用
- 多线程编程10----condition同步工具类的使用
- iOS多线程编程之NSThread的使用
- iOS多线程编程之NSThread使用
- Java多线程编程-线程池的使用
- iOS多线程编程之NSThread的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用(转自容芳志专栏)
- 5天玩转C#并行和多线程编程 —— 第三天 认识和使用Task
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- .NET 4中的多线程编程之一:使用Task(转载)
- C++,多线程编程------使用同步对象编程(转)
- iOS多线程编程之NSThread的使用