临界区线程对象的使用

简介: 临界区线程对象的使用

#include <windows.h>

#include <iostream>

using namespace std;

 

CRITICAL_SECTION g_cs;

bool g_bContinue = true;

int g_count1 = 0;

int g_count2 = 0;

 

DWORD WINAPI ThreadProc(LPVOID lpParameter);

 

int main()

{

HANDLE g_hTrd[2];

 

InitializeCriticalSection(&g_cs);     //This function initializes a critical section object.  

 

g_hTrd[0] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);

g_hTrd[1] = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);

 

WaitForMultipleObjects(2,g_hTrd,FALSE,1000);  

g_bContinue = false;

 

CloseHandle(g_hTrd[0]);

CloseHandle(g_hTrd[1]);

 

DeleteCriticalSection(&g_cs);       //This function releases all resources used by an unowned critical section object.  

 

Sleep(1);

cout << "g_count1 = " << g_count1 << "\t g_count2 = " << g_count2 << endl;

return 0;

}

 

 

DWORD WINAPI ThreadProc(LPVOID lpParameter)

{

while(g_bContinue)

{

 //This function waits for ownership of the specified critical section object.  

 //The function returns when the calling thread is granted ownership.  

 EnterCriticalSection(&g_cs);  

 g_count1++;

 g_count2++;

 cout << "g_cnt1 = " << g_count1 << "\t g_cnt2 = " << g_count2 << endl;

 //This function releases ownership of the specified critical section object.  

LeaveCriticalSection(&g_cs);                

}

return 0;

}

相关文章
|
1月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
|
1月前
|
安全 Java
LinkedBlockingQueue 是线程安全的,为什么会有两个线程都take()到同一个对象了?
LinkedBlockingQueue 是线程安全的,为什么会有两个线程都take()到同一个对象了?
34 0
|
2月前
|
安全 Java C#
Spring创建的单例对象,存在线程安全问题吗?
Spring框架提供了多种Bean作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)、全局会话(GlobalSession)等。单例是默认作用域,保证每个Spring容器中只有一个Bean实例;原型作用域则每次请求都会创建一个新的Bean实例;请求和会话作用域分别与HTTP请求和会话绑定,在Web应用中有效。 单例Bean在多线程环境中可能面临线程安全问题,Spring容器虽然确保Bean的创建过程是线程安全的,但Bean的使用安全性需开发者自行保证。保持Bean无状态是最简单的线程安全策略;
|
3月前
|
存储 缓存 算法
同时使用线程本地变量以及对象缓存的问题
【7月更文挑战第15天】同时使用线程本地变量和对象缓存需小心处理以避免数据不一致、竞争条件及内存泄漏等问题。线程本地变量使各线程拥有独立存储,但若与对象缓存关联,可能导致多线程环境下访问旧数据。缺乏同步机制时,多线程并发修改缓存中的共享对象还会引起数据混乱。此外,若线程结束时未释放对象引用,可能导致内存泄漏。例如,在Web服务器场景下,若一更新缓存而另一线程仍获取旧数据,则可能返回错误信息;在图像处理应用中,若多线程无序修改算法对象则可能产生错误处理结果。因此,需确保数据一致性、避免竞争条件并妥善管理内存。
|
3月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
45 0
|
4月前
|
安全 Java
如何测试map对象的线程不安全
【6月更文挑战第20天】如何测试map对象的线程不安全
37 0
|
5月前
|
存储 安全 Java
调用链跨线程传递 ThreadLocal 对象对比
说起本地线程专属变量,大家首先会想到的是 JDK 默认提供的 ThreadLocal,用来存储在整个链路中都需要访问的数据,并且是线程安全的。由于在落地全链路压测的过程中,一个基本并核心的功能需求是流量标记需要在整个链路中进行传递,那么线程上下文环境成为解决这个问题最合适的技术。
71 2
调用链跨线程传递 ThreadLocal 对象对比
|
5月前
|
存储 安全
除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
【2月更文挑战第5天】【2月更文挑战第12篇】除了Lock对象,还有其他方法可以实现多线程安全的单例模式吗?
31 1
|
5月前
|
存储 开发框架 安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
【C++ 线程】深入理解C++线程管理:从对象生命周期到线程安全
335 0
|
5月前
|
Java API 索引
Java 编程问题:十、并发-线程池、可调用对象和同步器4
Java 编程问题:十、并发-线程池、可调用对象和同步器
32 0