C++线程同步之临界区
2024-10-21 17:33:10
#include <iostream>
#include <windows.h>
using namespace std; CRITICAL_SECTION cs; // LockCount 它被初始化为数值 -1,此数值等于或大于 0 时,表示此临界区被占用;等待获得临界区的线程数:LockCount - (RecursionCount -1)
// RecursionCount 此字段包含所有者线程已经获得该临界区的次数
// OwningThread 此字段包含当前占用此临界区的线程的线程标识符,此线程 ID 与GetCurrentThreadId 所返回的 ID 相同 DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
for (int x = ; x < ; x++)
{
EnterCriticalSection(&cs);
Sleep();
printf("11111:%x %x %x\n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}
return ;
} DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
for (int x = ; x < ; x++)
{
EnterCriticalSection(&cs);
Sleep();
printf("22222:%x %x %x\n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}
return ;
} DWORD WINAPI ThreadProc3(LPVOID lpParameter)
{
for (int x = ; x < ; x++)
{
EnterCriticalSection(&cs);
Sleep();
printf("33333:%x %x %x\n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}
return ;
} DWORD WINAPI ThreadProc4(LPVOID lpParameter)
{
for (int x = ; x < ; x++)
{
EnterCriticalSection(&cs);
Sleep();
printf("44444:%x %x %x\n", cs.LockCount, cs.RecursionCount, cs.OwningThread);
LeaveCriticalSection(&cs);
}
return ;
} int main()
{
// 初始化临界区
InitializeCriticalSection(&cs);
// printf("%x %x %x", cs.LockCount, cs.RecursionCount, cs.OwningThread);
// 创建一个新的线程
HANDLE hTread1 = CreateThread(, , ThreadProc1, , , );
// 创建一个新的线程
HANDLE hTread2 = CreateThread(, , ThreadProc2, , , );
// 创建一个新的线程
HANDLE hTread3 = CreateThread(, , ThreadProc3, , , );
// 创建一个新的线程
HANDLE hTread4 = CreateThread(, , ThreadProc4, , , );
// 如果不在其它的地方引用它就关闭句柄
::CloseHandle(hTread1);
::CloseHandle(hTread2);
::CloseHandle(hTread3);
::CloseHandle(hTread4);
// 销毁临界区
// DeleteCriticalSection(&cs);
getchar();
return ;
}
最新文章
- js生成验证码并验证
- Navicat链接Oracle提示ORA-12737
- [转]Java静态方法为什么不能访问非静态方法
- BM25相关度打分公式
- mongrel
- F# 天生就是就异步和并行的料
- CentOS_6.5_x64:VNC安装配置
- WebSite---前台系统图片验证码心得
- Python—课时ONE
- springboot源码分析-SpringApplication
- vue+vuecli+webapck2实现多页面应用
- drawable自定义字体颜色
- 解决python解析文件时输出乱码
- mybatis13--2级缓存
- C - Cake HDU - 1722 (数学)
- windows下安装GIT,使用GIT GUI 上传文件到github
- 自学Java第一周的总结
- BigDecimal 类型数据比较大小
- Swift3 根据秒数获取视频时长(转换成00:00:00时间格式)以及将时长转换成秒
- java性能监控工具jstat
热门文章
- mysql事务回滚机制概述
- EasyNVR网页Chrome无插件播放安防摄像机视频流是怎么做到web浏览器延时一秒内
- 查看appPackage和appActivity的多种方法
- mysql使用yum源安装各个版本的mysql数据库
- Centos7.3使用脚本自动静默安装oracle11.2.0.4数据库
- python爬虫4猫眼电影的Top100
- pymysql DAO简单封装
- Javaspring+mybit+maven中实现定时任务
- SpringBoot常用注解(三)
- windows下大数据开发环境搭建(2)——Hadoop环境搭建