C++多线程环境下注意共享资源的释放顺序
比如我现在写一个多线程下载程序,包含DownloadTask、HttpDownload两个类。
class DownloadTask
{
//省略n行代码
public:
int m_threads;//需创建的线程总数
CCriticalSection m_cs;//临界区
void Stop();
}; class HttpDownload
{
//省略n行代码
HttpDownload(DownloadTask* task): m_task(task) { }
public:
DownloadTask* m_task;
void Start();//开始下载
}
每一个HttpDownload对象都是一个线程的执行单元,同一个任务下的所有线程共享同一个DownloadTask对象中的所有资源。如果这样编写下载程序:
//在某一个函数中
{
DownloadTask* myTask = new DownloadTask()
HttpDownload* download = new HttpDownload(myTask);
for(int i = ; i < myTask->m_threads; ++i)
AfxBeginThread(downloadThreadFun, download);
return ;
} UINT downloadThreadFun(LPVOID lParam)
{
auto_ptr<HttpDownload> pDownload((HttpDownload*)lParam);
pDownload->Start();
return ;
} void SetStop(DownloadTask* task)
{
task->Stop();
delete task;
}
在某一时刻,比如用户点击停止下载时,我们就需要delete掉这个DownloadTask对象。但是如果当前还有线程在运行,这样delete掉就会影响这些线程,直接导致程序出错。
所以,必须在delete DownloadTask对象前确定此下载任务中所有线程已经停止。于是可以这样写:
class DownloadTask
{
//省略n行代码
public:
int m_threads;//需要创建的线程总数
CCriticalSection m_cs;//临界区
int m_currentThreads;//当前运行的线程数
void Stop();
}; UINT downloadThreadFun(LPVOID lParam)
{
auto_ptr<HttpDownload> pDownload((HttpDownload*)lParam);
CSingleLock singleLock(&pDownload->m_task->m_cs);
pDownload->Start();
singleLock.Lock()
--pDownload->m_task->m_currentThreads;
return ;
} void SetStop(DownloadTask* task)
{
CSingleLock singleLock(&task->m_cs);
task->Stop();
singleLock.Lock();
if(task->m_currentThreads == )
delete task;
return ;
}
这样就保证在所有线程已经结束时才delete掉这个任务的DownloadTask对象。
C++多线程环境下注意共享资源的释放顺序的更多相关文章
- C++多线程环境下的构造函数
多线程的环境里,我们总不可避免要使用锁.于是一个常见的场景就是: class ObjectWithLock { private: std::mutex mtx_; SomeResType shared ...
- Asp.Net在多线程环境下的状态存储问题
在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息:或者基于当前方法调用栈,比如在同一个调用中涉及的多个层次 ...
- SQLite在多线程环境下的应用
文一 SQLite的FAQ里面已经专门说明,先贴出来.供以后像我目前的入门者学习. (7) 多个应用程序或者同一个应用程序的多个例程能同时存取同一个数据库文件吗? 多进程可以同时打开同一个数据库,也可 ...
- HttpClient在多线程环境下踩坑总结
问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状态. 而且,从程序日志中判断有线程处于han ...
- 一个由单例模式在多线程环境下引发的 bug
问题症状 HTTP 日志系统,老是出现日志信息覆盖的情况.比如同时调用 A 接口和 B 接口,B 接口请求响应信息变成了 A 接口请求响应相关信息.这个问题在并发量大的情况下越来越严重. 问题初步分析 ...
- C#多线程环境下调用 HttpWebRequest 并发连接限制
C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...
- 多线程环境下非安全Dictionary引起的“已添加了具有相同键的项”问题
问题: 代码是在多线程环境下,做了简单的Key是否存的判断, 测试代码如下: public class Program { static Dictionary<string, Logger> ...
- 多线程环境下的UI异步操作
转自原文 多线程环境下的UI异步操作 解决VS中,线程间不可互操作的问题,一揽子解决方案: 一.首先,定义一个类:SetControlProperty using System.Reflection; ...
- 关于java多线程任务执行时共享资源加锁的方式思考
1.加锁方式: 1-1.使用synchronized关键字进行方法或代码块的加锁方式 1-2.使用ReentrantLock类提供的lock()方法的方式 2.代码实现(传统的银行取款存款问题): 2 ...
随机推荐
- Centos编译Hadoop 2.x 源码
1. 前言 Hadoop-2.4.0的源码目录下有个BUILDING.txt文件,它介绍了如何在Linux和Windows下编译源代码,本文基本是遵照BUILDING.txt指示来操作的,这里再做一下 ...
- vim:关于映射和跳出括号
先说如何自动补全. 命令:vim .vimrc inoremap ( ()<ESC>i inoremap [ []<ESC>i inoremap { {}<ESC> ...
- Python 计算两个IP段之间的有效IP地址
Can anyone think of an algorithm to put all of the addresses between two others and put them in a li ...
- linux学习(34):except的安装
expect据说是交互性很强的脚本语言,但是expect依赖于tcl,但linux系统里一般不自带安装tcl,需要手动安装 expect版本 5.43 http://download.chinauni ...
- mysql 5.7以上版本安装配置方法图文教程(mysql 5.7.12\mysql 5.7.13\mysql 5.7.14)(转)
http://www.jb51.net/article/90302.htm ******************************* 这篇文章主要为大家分享了MySQL 5.7以上缩版本安装配置 ...
- Eclipse中直接操作本地文件系统
你是不是有时候觉得在Eclipse和windows资源管理器(也就是咱平时用的文件浏览器)之间切换很麻烦? Eclipse中也提供了本地文件系统浏览功能,在里面你也可以方便地进行各种文件操作 在Ecl ...
- java timer timertask mark
其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个类,而具体的TimerTask需要由你自己来实现,例如这样: 1 2 3 4 5 6 Timer timer = ...
- Makefile学习之路——4
变量的类别有递归扩展变量和简单扩展变量.只用一个“=”符号定义的变量被称为递归扩展变量.通过下面例子观察递归扩展变量的特点. .PHONY: all foo=$(bar) bar=$(ugh) ugh ...
- 【Unity】用代码给按钮动态添加点击事件
问题:多数情况下用UGUI的Button控件身上的OnClick()列表可以指明该按钮点击后触发的回调.现在想要调用自定义脚本里的方法,当这个脚本挂在Button所属的Canvas身上时,传入Canv ...
- 【WPF】C#代码动态添加控件的Margin属性
需求:一组按钮的数据是从服务器中Json数据发过来的,需要根据这个Json数据动态地添加这组按钮. 工具:使用http://www.newtonsoft.com/json来解析Json. 过程:C#代 ...