#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. Cache busting

    Cache busting https://www.keycdn.com/support/what-is-cache-busting https://curtistimson.co.uk/post/f ...

  2. android: android 布局中的weight 属性

    android: weight是线性布局的特有属性,控件的宽度和高度的不同,也会存在差异. 示例1:将宽度设置为包裹类型wrap_content或0dp <?xml version=" ...

  3. mysql 5.6配置

    简洁版: [client] port = 3306 socket = /weyeedata/mysql/run/mysql.sock [mysqld] innodb_buffer_pool_size ...

  4. Python3基础 二、八、十、十六进制数的定义

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  5. Sword 计算机内存对齐

    内存对齐理论 a.数据的对齐(alignment) 指数据的地址和由硬件条件决定的内存块大小之间的关系.一个变量的地址是它大小的倍数的时候,这就叫做自然对齐(naturally aligned). 例 ...

  6. mysql使用yum源安装各个版本的mysql数据库

    每次想用yum安装旧版本的mysql时,发现都找不到mysql的yum安装源,在官网只能找到最新版本mysql的yum源.后来才知道,原来最新的mysql的yum源也是包含了旧版本的mysql的yum ...

  7. [LeetCode] 636. Exclusive Time of Functions 函数的独家时间

    Given the running logs of n functions that are executed in a nonpreemptive single threaded CPU, find ...

  8. 【视频开发】【CUDA开发】FFMPEG硬件加速-nvidia方案

    1.目标 <1>显卡性能参数: <2>方案可行性: 2.平台信息 2.1.查看当前显卡信息 命令:  lspci |grep VGA  信息:  01:00.0 VGA com ...

  9. centos 安装 swoole_framework 框架

    composer require "matyhtf/swoole_framework" 运行以上命令 Using version ^1.20 for matyhtf/swoole_ ...

  10. C++中int型数据的十六进制写法

    C++中int类型数据的十六进制写法 在C++中,int类型一般表示一个有符号的32位整数.在一些情况下(例如进行位操作时)我们需要使用十六进制的方式来表示int类型.int32的取值范围:最大值:2 ...