最近发现写的代码中,一个类A中存在一个线程成员对象B, 某个时刻,通过类A对象将线程对象B进行启动,然后类A的对象存放在一个容器中进行管理,容器在满足一定条件将类A的对象进行删除,但是并没有进行线程对象B的停止操作。
因此,在此处进行测试,看一下A对象被删除,线程是否还在运行。
经过测试发现,线程还是在运行中。。。。。
#include <thread>
#include <vector>
#include <functional>
#include <iostream>
class CThreadObj {
public:
CThreadObj()
: m_bIsRunning(false)
, m_count(0)
, m_pT(NULL)
{
};
void StartThread()
{
m_bIsRunning = true;
m_pT = new std::thread(std::bind(&CThreadObj::ProcessThread, this));
};
void StopThread()
{
m_bIsRunning = false;
};
void ProcessThread()
{
while (m_bIsRunning)
{
//std::this_thread::sleep_for(std::chrono::milliseconds(1));
std::cout << "threadId: "<<std::this_thread::get_id()
<< " current number:" << m_count++ << std::endl;
}
};
private:
bool m_bIsRunning;
unsigned int m_count;
std::thread *m_pT;
};
int main()
{
std::cout << "main threadID: " << std::this_thread::get_id() << std::endl;
std::vector<std::shared_ptr<CThreadObj>> vecThreadObj;
auto pObj = std::make_shared<CThreadObj>();
pObj->StartThread();
vecThreadObj.push_back(pObj);
std::this_thread::sleep_for(std::chrono::seconds(10));
vecThreadObj.erase(vecThreadObj.begin());
std::cout << "Thread Obj is already erase in main thread." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(30));
return 0;
通过打印出来的ThreadId,通过输出的log, 或者工具ProcessThreadsView可以查看到,线程还在运行中。
当然如果进程结束了,就看不到线程了。