#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 ;
}

C++线程同步之临界区的更多相关文章

  1. Delphi线程同步(临界区、互斥、信号量)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  2. Delphi线程同步(临界区、互斥、信号量,包括详细代码)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...

  3. OpenMP 线程同步之临界区

    多核/多线程编程中肯定会用到同步互斥操作.除了互斥变量以为,就是临界区. 临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段. 在OpenMP中临界区声明方法如下: #pragma ...

  4. VC++线程同步之临界区(CriticalSection)

    1.相关文件和接口 #include <windows.h> CRITICAL_SECTION cs;//定义临界区对象 InitializeCriticalSection(&cs ...

  5. win32多线程 (二)线程同步之临界区 (critical sections)

    所谓critical sections 意指一小块“用来处理一份被共享之资源”的程序代码.你可能必须在程序的许多地方处理这一块可共享的资源.所有这些程序代码可以被同一个critical  sectio ...

  6. Delphi 线程同步技术(转)

    上次跟大家分享了线程的标准代码,其实在线程的使用中最重要的是线程的同步问题,如果你在使用线程后,发现你的界面经常被卡死,或者无法显示出来,显示混乱,你的使用的变量值老是不按预想的变化,结果往往出乎意料 ...

  7. 关于windows线程同步的四种方法

    #include "stdafx.h" #include "iostream" #include "list" #include " ...

  8. 线程同步方式之互斥量Mutex

    互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的. 互斥量相对于临界区更为高级,可以对互 ...

  9. C++实现线程同步的几种方式

    线程同步是指同一进程中的多个线程互相协调工作从而达到一致性.之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多个线程同时修改同一数据造成破坏的例子: # ...

随机推荐

  1. InvalidSelectorError: Compound class names not permitted报错处理

    InvalidSelectorError: Compound class names not permitted报错处理 环境:python3.6 + selenium 3.11 +  chromed ...

  2. 网络公开课和MOOC资源

    美国(USA) 1. 麻省理工学院开放课程(Free Online Course Materials/ MIT OpenCourseWare) 2. 耶鲁大学开放课程(Online Video Lec ...

  3. python 把带小数的浮点型字符串转换为整数的解决方案

    以下内容在python中完全可以接受: 将整数的字符串表示形式传递给 int 将float的字符串表示形式传递给 float 但是,如果你将float型的字符串传递给int将会得到错误. >&g ...

  4. 初识HDFS(10分钟了解HDFS、NameNode和DataNode)

    概览 首先我们来认识一下HDFS, HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.它其实是将一个大文件分成若干块保存在不同服务器的多个节点中.通 ...

  5. Eventbus的功能

    Eventbus的功能 http://masstransit-project.com/ MassTransit is a free, open source, lightweight message ...

  6. html5获取自己定位的方法

    html5获取自己定位的方法直接用高德地图api 不要用百度地图api 不准确 <pre><!doctype html><html><head> < ...

  7. 「LOJ2091」「ZJOI2016」小星星 容斥+DP

    题目描述 小 Y 是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用 \(m\)条彩色的细线串了起来,每条细线连着两颗小星星.有一天她发现,她的饰品被破坏了,很多细线都被拆掉 ...

  8. Coursera,Udacity,Edx 课程列表(更新ing)

    Coursera,Udacity,Edx 课程列表(更新ing) Coursera有很多特别好的课程,平时没有机会听到国外大牛的课程,通过Coursera算是可以弥补一下吧,国外的课程普遍比国内的老师 ...

  9. [转帖]【MySQL+keepalived】用keepalived实现MySQL主主模式的高可用

    [MySQL+keepalived]用keepalived实现MySQL主主模式的高可用 https://www.jianshu.com/p/8694d07595bc 一.实验说明 MySQL主主模式 ...

  10. GCC 基础知识

    目录 GCC 基础知识 一.GCC编译选项解析 二.多模块.多个文件一起编译 三.静态库与动态库 四.查看帮助文档 GCC 基础知识 一.GCC编译选项解析 1. 常用编译选项 命令格式:gcc [选 ...