比如我现在写一个多线程下载程序,包含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++多线程环境下注意共享资源的释放顺序的更多相关文章

  1. C++多线程环境下的构造函数

    多线程的环境里,我们总不可避免要使用锁.于是一个常见的场景就是: class ObjectWithLock { private: std::mutex mtx_; SomeResType shared ...

  2. Asp.Net在多线程环境下的状态存储问题

    在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息:或者基于当前方法调用栈,比如在同一个调用中涉及的多个层次 ...

  3. SQLite在多线程环境下的应用

    文一 SQLite的FAQ里面已经专门说明,先贴出来.供以后像我目前的入门者学习. (7) 多个应用程序或者同一个应用程序的多个例程能同时存取同一个数据库文件吗? 多进程可以同时打开同一个数据库,也可 ...

  4. HttpClient在多线程环境下踩坑总结

    问题现场 在多线程环境下使用HttpClient组件对某个HTTP服务发起请求,运行一段时间之后发现客户端主机CPU利用率呈现出下降趋势,而不是一个稳定的状态. 而且,从程序日志中判断有线程处于han ...

  5. 一个由单例模式在多线程环境下引发的 bug

    问题症状 HTTP 日志系统,老是出现日志信息覆盖的情况.比如同时调用 A 接口和 B 接口,B 接口请求响应信息变成了 A 接口请求响应相关信息.这个问题在并发量大的情况下越来越严重. 问题初步分析 ...

  6. C#多线程环境下调用 HttpWebRequest 并发连接限制

    C#多线程环境下调用 HttpWebRequest 并发连接限制 .net 的 HttpWebRequest 或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如 win ...

  7. 多线程环境下非安全Dictionary引起的“已添加了具有相同键的项”问题

    问题: 代码是在多线程环境下,做了简单的Key是否存的判断, 测试代码如下: public class Program { static Dictionary<string, Logger> ...

  8. 多线程环境下的UI异步操作

    转自原文 多线程环境下的UI异步操作 解决VS中,线程间不可互操作的问题,一揽子解决方案: 一.首先,定义一个类:SetControlProperty using System.Reflection; ...

  9. 关于java多线程任务执行时共享资源加锁的方式思考

    1.加锁方式: 1-1.使用synchronized关键字进行方法或代码块的加锁方式 1-2.使用ReentrantLock类提供的lock()方法的方式 2.代码实现(传统的银行取款存款问题): 2 ...

随机推荐

  1. 多主机共享ssh Public/Private Key

    前期服务器比较少,所有代码都放在github的私库中,在自己的github 设置中设置SSH keys就可以拉下相应的库中的代码到本地与服务器了,但是最近服务器多家了几台,每台都生成key加到gith ...

  2. cocos2dx 3.x 避免空sprite

    由于cocos2dx 3.x中autobatch的,如果场景中含有空sprite(并且还不处于visible==false状态)的话,则会打断流水线(因为空sprite的贴图与其它元素的贴图必定不在同 ...

  3. JDK1.5新特性,基础类库篇,格式化类(Formatter)用法

    Formatter类提供了对布局对齐和排列的支持,以及对数值.字符串和日期.时间数据的常规格式和特定于语言环境的输出的支持.通用Java类型,诸如byte.BigDecimal和Calendar都被支 ...

  4. putty设置用key自动登录

    1.在Linux下ssh-keygen -t rsa 生成密钥对 2.把私钥id_isa下载到用scp下载到windows并用puttygen加载并重新保存私钥. 3.在windows下新建快捷方式, ...

  5. 【Android】3.4 图层展示

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 3.4 示例4--图层展示 一.简介 1.地图类型 百度地图Android SDK 3.7.1提供了两种类型的 ...

  6. Webpack中的sourcemap

    Webpack中sourcemap的配置 sourcemap是为了解决开发代码与实际运行代码不一致时帮助我们debug到原始开发代码的技术.尤其是如今前端开发中大部分的代码都经过编译,打包等工程化转换 ...

  7. JS页面跳转并及时刷新

    "<script type='text/javascript'>alert('操作成功!');window.history.go(-2);window.close();</ ...

  8. 孙鑫VC++视频教程笔记

    写在前面的话:在学习孙鑫老师的VC++视频时,为了加深自己对知识的深入理解,就做了下面的笔记. 第一讲: 第二讲: 第三讲: 第四讲: 第五讲: 第六讲: 第七讲: 第八讲: 第九讲: 第十讲: 第十 ...

  9. Oracle数据库字符集问题解析

    Oracle数据库字符集问题解析 经常看到一些朋友问ORACLE字符集方面的问题,我想以迭代的方式来介绍一下.第一次迭代:掌握字符集方面的基本概念.有些朋友可能会认为这是多此一举,但实际上正是由于对相 ...

  10. 【转】Hadoop安全实践

    前言 在2014年初,我们将线上使用的 Hadoop 1.0 集群切换到 Hadoop 2.2.0 稳定版, 与此同时部署了 Hadoop 的安全认证.本文主要介绍在 Hadoop 2.2.0 上部署 ...