用户模式下的多线程同步——关键段
来源:互联网 发布:js setcookie 作用域 编辑:程序博客网 时间:2024/06/08 13:54
关键段使线程访问共享资源之前独占它,共享资源访问结束后线程释放对资源的独占。但是这个过程中,系统也可能暂停该线程取调度其他线程,但是,在关键段释放之前,不会调度其他想访问同一资源的线程。
#include "stdafx.h"#include <windows.h> #include <process.h> #include <iostream>using namespace std;int g_x = 0;//把CRITICAL_SECTION定义成全局变量,以使所有的线程都能方便快速访问CRITICAL_SECTION g_cs;UINT WINAPI ThreadFunc1(PVOID pArguments){ // EnterCriticalSection和LeaveCriticalSection把共享资源包起来 EnterCriticalSection(&g_cs); cout << "ThreadFunc1.." << endl; int n = 0; while (n < 3) { g_x += n; n++; } LeaveCriticalSection(&g_cs); _endthreadex(0); return 0;}UINT WINAPI ThreadFunc2(PVOID pArguments){ EnterCriticalSection(&g_cs); cout << "ThreadFunc2.." << endl; int n = 0; while (n < 5) { g_x += n; n++; } LeaveCriticalSection(&g_cs); _endthreadex(0); return 0;}int _tmain(int argc, _TCHAR* argv[]){ HANDLE handle1, handle2; unsigned unThread1ID, unThread2ID; cout << "g_x initial value: " << g_x << endl; //必须初始化CRITICAL_SECTION成员 InitializeCriticalSection(&g_cs); handle1 = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc1, NULL, 0, &unThread1ID); handle2 = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc2, NULL, 0, &unThread2ID); WaitForSingleObject(handle1, INFINITE); WaitForSingleObject(handle2, INFINITE); cout << "g_x Final value: " << g_x << endl; //清理CRITICAL_SECTION成员 DeleteCriticalSection(&g_cs); getchar(); return 0;}
有点: 容易使用,并且内部使用了Interlocked函数,因此执行速度非常快。
缺点: 不能在多个进程之间对线程同步
阅读全文
0 0
- 用户模式下的多线程同步——关键段
- 用户模式下线程同步之关键段
- 【Windows核心编程学习笔记】用户模式下的线程同步之二---关键段(critical section)
- 多线程同步问题——关键段、互斥量、事件、信号量
- 用户模式下的多线程同步——原子访问(Interlocked系列函数)
- 线程同步——用户模式下的线程同步
- Windows线程同步—用户模式下的线程同步
- 多线程篇(二)——线程之间的同步与互斥,关键段的使用
- 线程同步 关键代码段 CRITICAL_SECTION 用户模式同步对象 InitializeCriticalSection
- -【用户方式线程同步】关键代码段
- 利用关键代码段实现多线程同步
- 白话windows多线程同步之关键段
- windows下多线程同步(利用事件对象,互斥对象,关键代码段)实现
- 多线程同步的三种方法-互斥量-事件对象-关键代码段(临界区)
- 多线程之五 经典线程同步 关键段CS
- 多线程三 经典线程同步之关键段CS
- 多线程同步:互斥对象、事件对象、关键代码段
- 多线程4:经典线程同步 关键段CS
- hadoop中如何控制map的数量
- 移动游戏 状态同步 帧同步
- flume-ng-1.6.0-cdh5.5.2用maven重新编译打包
- Latex图片并排
- 自定义控件(一)
- 用户模式下的多线程同步——关键段
- SpringBoot连接SQLite数据库(基于Spring-Data-Jpa和Gradle配置)
- 如何使用CSDN-markdown编辑器
- django通用视图(视图类)的login登陆、权限限定
- WebServiceUtil
- 【HDU 2553】 N皇后问题
- 用 GitLab CI 进行持续集成
- JProfiler9.1.1安装和远程调试linux环境Tomcat配置
- startService与bindService的区别