Win32环境下两种用于C++的线程同步类(上)
struct MyStruct ...{ int a, b; };
MyStruct s;
//线程1:
int a = s.a;
int b = s.b;
//线程2:
s.a++;
s.b--;
CRITICAL_SECTION cs;
InitializeCriticalSection(&cs);
//线程1:
EnterCriticalSection(&cs);
int a = s.a;
int b = s.b;
LeaveCriticalSection(&cs);
//线程2:
EnterCriticalSection(&cs);
s.a++;
s.b--;
LeaveCriticalSection(&cs);
//最后:
DeleteCriticalSection(&cs);
代码中的临界区变量(cs)就可以看作是变量s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了。访问完成后,调用LeaveCriticalSection表示释放这把锁,允许其他线程继续使用它。
...{
CRITICAL_SECTION cs;
protected:
InstanceLockBase() ...{ InitialCriticalSection(&cs); }
~InstanceLockBase() ...{ DeleteCriticalSection(&cs); }
};
如果熟悉C++,看到这里一定知道后面我要干什么了,对了,就是继承,因为我把构造函数和析构函数都声明为保护的(protected),这样唯一的作用就是在子类里使用它。让我们的被保护数据从这个类继承,那么它们不就不可分割了吗:
...;
...{
CRITICAL_SECTION cs;
void Lock() ...{ EnterCriticalSection(&cs); }
void Unlock() ...{ LeaveCriticalSection(&cs); }
…
};
...{
InstanceLockBase* _pObj;
public:
InstanceLock(InstanceLockBase* pObj)
...{
_pObj = pObj; //这里会保存一份指向s的指针,用于解锁
if(NULL != _pObj)
_pObj->Lock(); //这里加锁
}
~InstanceLock()
...{
if(NULL != _pObj)
_pObj->Unlock(); //这里解锁
}
};
...{
friend class InstanceLock;
…
};
...{
InstanceLock lock(&s); //这里已经实现加锁了
//some operations on s
}
//一旦离开lock对象的作用域,自动解锁
...{
InstanceLock lock(&s);
// do something …
}
…
好了,就是这么简单。下面来看一个测试。
...{
static int count = 0;
SYSTEMTIME st;
::GetLocalTime(&st);
printf("%03d [%02d:%02d:%02d.%03d]%s ", ++count, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, text);
}
...{};
MyClass mc;
...{
InstanceLock il(&mc);
Say("in sub thread, lock");
Sleep(2000);
Say("in sub thread, unlock");
return 0;
}
...{
InstanceLock il(&mc);
Say("in main thread, lock");
Sleep(3000);
Say("in main thread, lock");
}
运行此程序,得到的输出如下:
#include <windows.h>
class InstanceLock;
class InstanceLockBase
...{
friend class InstanceLock;
CRITICAL_SECTION cs;
void Lock()
...{
::EnterCriticalSection(&cs);
}
void Unlock()
...{
::LeaveCriticalSection(&cs);
}
protected:
InstanceLockBase()
...{
::InitializeCriticalSection(&cs);
}
~InstanceLockBase()
...{
::DeleteCriticalSection(&cs);
}
};
class InstanceLock
...{
InstanceLockBase* _pObj;
public:
InstanceLock(InstanceLockBase* pObj)
...{
_pObj = pObj;
if(NULL != _pObj)
_pObj->Lock();
}
~InstanceLock()
...{
if(NULL != _pObj)
_pObj->Unlock();
}
};
转载于:https://www.cnblogs.com/highmayor/archive/2008/01/28/1056352.html
Win32环境下两种用于C++的线程同步类(上)相关推荐
- android登录加密传输,android环境下两种md5加密方式(示例代码)
在平时开发过程中,MD5加密是一个比較经常使用的算法,最常见的使用场景就是在帐号注冊时,用户输入的password经md5加密后,传输至server保存起来.尽管md5加密经经常使用.可是md5的加密 ...
- Win32环境下动态链接库(DLL)编程原理
Win32环境下动态链接库(DLL)编程原理 比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系 ...
- Win32环境下代码注入与API钩子的实现
Win32环境下代码注入与API钩子的实现 本文详细的介绍了在Visual Studio(以下简称VS)下实现API钩子的编程方法,阅读本文需要基础:有操作系统的基本知识(进程管理,内存管理),会在V ...
- Win32 环境下的堆栈
原文已经找不到,作者应该是:http://blog.csdn.net/slimak 但是没有找到此文,其中丢了2幅图 简介 在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack) ...
- 单例模式的5种实现方式,以及在多线程环境下5种创建单例模式的效率
这段时间从头温习设计模式.记载下来,以便自己复习,也分享给大家. [java] view plaincopy package com.iter.devbox.singleton; /** * 饿汉式 ...
- Win32环境下轻松调试单板安全模式软件下载功能
Win32环境下轻松调试单板安全模式软件下载功能 温辉敏(wenhm@sina.com) 摘要:本文首先提出了在单板环境下调试软件下载功能的低效率和复杂性,然后进行了Win32环境下调试软件下载功能的 ...
- centos下两种方法安装git
centos 5 64位下两种方法安装git 这里来给大家介绍下编译安装和yum安装git. 系统:centos 5.5 64位 需要的软件包:git-latest.tar.gz epel-r ...
- Linux环境下几种常用的文件系统
Linux环境下几种常用的文件系统: 1.ext2 ext2是为解决ext文件系统的缺陷而设计的可扩展的.高性能的文件系统,又被称为二级扩展文件系统.它是Linux文件系统中使用最多的类型,并且在速度 ...
- 早教产品微商怎么做精准引流?早教机构引流活动可以分为线上和线下两种
早教产品微商怎么做精准引流?早教机构引流活动可以分为线上和线下两种 一般来说,根据媒介的不同,早教机构引流活动可以分为线上和线下两种,线上的引流方式有:微信.自媒体.短视频;线下的引流方式有地推和异业 ...
最新文章
- Java设计模式:抽像工厂模式
- 最短路计数(spfa)
- 学习 PixiJS — 交互工具
- 使用Forge插件在现有Java EE项目上启用Arquillian
- 发布 项目_项目发布会活动到底应该怎么办
- 60-008-026-使用-命令-如何在flink中传递参数
- 简单的PL/SQl链接远程ORACLE数据库方法
- 实体和电商哪个更能赚到?
- 杨氏模量_快!准!狠!——5分钟搞定A-Level物理必考知识点杨氏模量曲线...
- MSSQL日期格式转换函数(使用CONVERT)
- 搭建apache_??4、Apache环境web搭建
- 第一行代码--笔记(3)
- 教程贴--DISM 安装系统
- Redis docker安装及redis.conf配置文件解析
- 魅力网络技术博客图像处理正文 ps入门教程、ps修图基本工具使用方法视频教学...
- 出差日程安排软件哪个好
- 小人物解决四大数学问题:记传奇华人数学家李天岩
- 感知机算法基础形式及对偶形式算法
- html5 i标签什么意思,快速了解HTML5 b和i标签
- 浅谈cocos2d游戏中天气系统的简单实现
热门文章
- 当面试官问我Mybatis初始化原理时,我笑了
- python 对指定URL获取其子链接
- Spring Cloud构建微服务架构(四)分布式配置中心
- itemchanged信号找不到_失物 | 求FDU同学帮转帮找蓝牙键盘,坐标东区宿舍19号楼...
- 网络故障排除工具 | 快速定位网络故障
- 数据中心水冷系统备品备件管理新思路
- 选择海外数据中心是否等级越高越好
- bootstrap项目更改为vue_取代Jquery,用Vue 构建Bootstrap 4 应用
- java什么是服务治理平台_Java | Spring Cloud 是如何实现服务治理的
- AI:2020年6月16日晚20点陆奇博士演讲《正视挑战把握创业创新机会》