关于线程安全退出
来源:互联网 发布:提成软件 编辑:程序博客网 时间:2024/05/18 04:00
之前的想法是,如果尽量不要在线程中分配内存,这样当线程没有正常退出时,很容易就出现内存泄漏的情况。
所以在这里的test代码也是如此,没有在线程中分配内存,而是在主线程中分配的内存供线程使用。
关于线程正常退出的关键在于:如果在设置了控制线程函数循环的标志位workstatus为false,也需要等待将正在执行的这次循环执行完,才能释放线程中的使用的内存。但是不清楚线程退出了此次的while功能语句的循环需要多长时间,如果时间长了,主线程(可能是用户)不能接受。如果时间短了,在线程还在使用内存时,用TerminateThread()强制退出线程并释放内存,必然造成功能上的缺失,处理数据的不正常,这样的退出方式通常不是我们希望看到的。
解决办法:在主线程的stop中等待需要结束的分线程中while循环已经退出的同步量Event,如果得到这个同步量Event,这说明我们可以释放内存了,此时线程已经正常退出了。 由系统智能的得到将workstatus置为false后的线程正常退出需要的时间,而不是我们的主观臆断。
可能还是从代码中来看,会简单很多:
头文件:
#pragma once
#include <afxmt.h>
class CCCThread
{
public:
CCCThread(void);
~CCCThread(void);
public:
//开始
int Start();
//结束
int Stop();
private:
LPBYTE m_pMem;
UINT static _sThreadFunc(void *_p);//线程函数
bool m_workstatus;//工作状态
CEvent m_endEvent;//线程是否已经退出循环
CWinThread *m_pThread;//线程指针
};
源文件:
#include "StdAfx.h"
#include "CCThread.h"
CCCThread::CCCThread(void)
{
}
CCCThread::~CCCThread(void)
{
}
int CCCThread::Start()
{
m_pMem=new BYTE[10000];
m_workstatus=true;
m_pThread=AfxBeginThread(_sThreadFunc,this,THREAD_PRIORITY_NORMAL);
TRACE("Start!");
return 0;
}
int CCCThread::Stop()
{
m_workstatus=false;
WaitForSingleObject(m_endEvent,INFINITE);
TRACE("Been stopped!");
delete [ ]m_pMem;
return 0;
}
UINT CCCThread::_sThreadFunc(void *_p)
{
CCCThread *pMain=(CCCThread *)_p;
while(pMain->m_workstatus)
{
TRACE("running/n");
}
pMain->m_endEvent.SetEvent();
return 0;
}
在main函数中实践测试过,没有问题。如果有什么问题,希望大家提出。
- 关于线程安全退出
- 关于线程安全退出
- 安全退出线程方法
- 线程的安全退出
- 线程安全退出
- 线程【六】线程安全退出
- java 安全退出线程详解
- java 安全退出线程详解
- 如何退出当前线程及线程安全
- 【线程退出】:VC线程安全退出的方法
- android 中,关于线程安全退出的问题(from stack overflow)
- FreeLibraryAndExitThread DLL中线程的安全退出
- FreeLibraryAndExitThread DLL中线程的安全退出
- FreeLibraryAndExitThread DLL中线程的安全退出
- Linux下如何安全退出线程
- VC线程安全退出的方法
- 多线程编程之线程安全退出
- [java多线程]如何安全的退出线程
- linux 下启动oracle数据库
- VC知识库网站
- JavaScript中Unicode编码的使用及相关函数
- tftp和xinetd服务器的配置
- [教程] RedHat9安装图解
- 关于线程安全退出
- SQl 优化收集、总结
- 嵌入式系统文件系统比较 jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs
- 1:GET访问 浏览器 认为 是等幂的
- POJ 3414 Pots(BFS倒水问题)
- Android 源码下载编译
- Actskin 界面皮肤
- 用 select 语句中的 start with...connect by prior 子句实现递归查询
- ashx jQuery $.post()方法中文不会出现乱码