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 ...
随机推荐
- sublim3常用插件安装
1首先需要安装插件管理器Package Control,点击View > Show Console菜单,输入以下代码,按回车运行即可.说明:以下只对st3有效 import urllib.req ...
- jquery data方法获取某个元素上事件
获取某个元素上的事件,jquery的给元素绑定的事件可以用data方法取出来. 通过$(element).data("events")来获取 // 比如给一个button绑定两个c ...
- jquery图片放大功能简单实现
图片放大在某些例如商品细节放大图比较常见,本文写了一个图片放大的示例适合日常应付,有需求的朋友可以参考下 <div class="jqzoom"> <img sr ...
- iOS改变UINavigationBar导航条标题颜色和字体
转自:http://www.2cto.com/kf/201311/260409.html iOS 5 以后 UINavigationController 可以 改变UINavigationBar导航条 ...
- C++11新特性应用--介绍几个新增的便利算法(用于排序的几个算法)
继续C++11在头文件algorithm中添加的算法. 至少我认为,在stl的算法中,用到最多的就是sort了,我们不去探索sort的源代码.就是介绍C++11新增的几个关于排序的函数. 对于一个序列 ...
- hive 启动 Specified key was too long; max key length is 767 bytes解决办法
解决方案: 在mysql机器的上命令行中运行: alter database hivemanual character set latin1; 问题解决.
- 几种任务调度的 Java 实现方法与比较 mark
任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务.本文由浅入深介绍四种任务调度的 Java 实现: Timer ScheduledExecutor 开源工具包 Quartz 开源工 ...
- iOS-打包成ipa的4种方法
打包ipa的前提 1.证书的申请和设置和上面文章的一样 从第一步到第四步都是一样的http://www.cnblogs.com/sunfuyou/p/5900592.html2.还有第六步的 1-3都 ...
- vue点击返回顶部插件vue-totop
vue-totop vue 点击返回顶部插件,可以根据参数设定按钮大小,颜色,类型,返回顶部的时间等.github地址:https://github.com/1006008051/vue-totop, ...
- Android AsyncTask 源代码分析
AsyncTask源代码分析 public abstract class AsyncTask<Params, Progress, Result> { //日志TAG private sta ...