C++【线程同步】-临界区同步
来源:互联网 发布:linux下mysql启动命令 编辑:程序博客网 时间:2024/05/19 12:13
当多个线程对同一个数据进行读写的时候,如果这时候线程1对数据进行读取,而线程2在修改该数据,那么就会出现无法预料的结果。所以这时候就需要线程同步。
线程同步之临界区:
临界区是一段不会被中断的代码,多个线程只能有一个线程在临界区中。如果一个线程要进入临界区,而临界区中有其他线程,那么该线程会被挂起,直到临界区中的线程离开。
示例代码:
#include "stdafx.h"#include<iostream>#include<process.h>#include<Windows.h>using namespace std;CRITICAL_SECTION cs; //声明临界区void TestThread1(void* pvoid){ EnterCriticalSection(&cs); //进入临界区 cout << "线程1进去临界区\n"; Sleep(2000); LeaveCriticalSection(&cs); //离开临界区 cout << "线程1离开临界区\n"; _endthread();}void TestThread2(void* pvoid){ EnterCriticalSection(&cs); //进入临界区 cout << "线程2进去临界区\n"; LeaveCriticalSection(&cs); //离开临界区 cout << "线程2离开临界区\n"; _endthread();}void TestThread3(void* pvoid){ EnterCriticalSection(&cs); //进入临界区 cout << "线程3进去临界区\n"; LeaveCriticalSection(&cs); //离开临界区 cout << "线程3离开临界区\n"; _endthread();}void Test(){ InitializeCriticalSection(&cs); //初始化临界区 cout << "线程1起\n"; _beginthread(TestThread1, 0, nullptr); Sleep(100); // 保证TestThread1先进入临界区 cout << "线程2起\n"; _beginthread(TestThread2, 0, nullptr); cout << "线程3起\n"; _beginthread(TestThread3, 0, nullptr);}int _tmain(int argc, _TCHAR* argv[]){ Test(); while (1) { Sleep(100); } DeleteCriticalSection(&cs); //不需要的时候删除临界区 system("pause"); return 0;}
输出结果:
从输出这可以看出,线程1先进入临界区,这时候线程2和线程3都起了,都要进入临界区,但临界区中线程1在执行,所以线程2和线程3都被挂起,直到线程1离开临界区之后,线程2才进入临界区
ps1:如果在主线程中使用临界区需要非常注意,如果子线程在临界区停留太久,那主线程就会阻塞很久。
ps2:临界区同步只局限于在于同一个进程中使用,如果在不同进程中共享数据,那么就不能使用临界区了。
0 0
- C++【线程同步】-临界区同步
- 线程同步-临界区
- 线程同步-临界区
- 线程同步之临界区
- 线程同步之临界区
- 线程同步之一:临界区
- 线程同步--临界区技术
- VC 线程同步 临界区
- 线程同步-临界区对象
- delphi 线程同步 临界区
- 线程同步之临界区
- 线程同步-临界区对象
- 临界区实现线程同步互斥
- 线程同步方法一: CRITICAL_SECTION (临界区)
- 线程同步 CCriticalSection(临界区类)
- 线程同步 CCriticalSection(临界区类)
- 线程的同步(一)---临界区
- 线程同步----临界区与互斥量
- Maven使用大纲
- JDBC 接口
- LintCode-剑指Offer-(374)螺旋矩阵
- Android进阶之路——NDK(一)
- 欢迎使用CSDN-markdown编辑器
- C++【线程同步】-临界区同步
- unbuntu server12.04配置hadoop2.7.1(二):ubantu常用命令与准备知识
- Unity之EditorGUILayout-Enum、Popup、EnumMaskField
- C++抛出异常与传递参数的区别
- JDBC 结果集
- 树链剖分
- OC-1-面向对象
- 1021. Deepest Root (25) DFS
- 从今天开始学习ios,入门第一天(Object-C学习笔记)自动引用计数和为类添加属性