test.hpp
#ifndef __INTERNAL_THREAD_HPP__
#define __INTERNAL_THREAD_HPP__
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
using boost::shared_ptr;
namespace boost { class thread; }
class InternalThread
{
public:
InternalThread() : thread_()
{
}
virtual ~InternalThread();
void StartInternalThread();
void StopInternalThread();
bool is_started() const;
protected:
virtual void InternalThreadEntry();
bool must_stop();
private:
void entry();
shared_ptr<boost::thread> thread_;
};
#endif
test.cpp
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <exception>
#include <iostream>
#include <sys/types.h>
#include "my_thread.hpp"
/* 析构函数,终止线程 */
InternalThread::~InternalThread()
{
StopInternalThread();
}
/* 线程是否启动,是返回true */
bool InternalThread::is_started() const
{
return thread_ && thread_->joinable();
}
/* 线程是否要关闭,是返回true */
bool InternalThread::must_stop()
{
/* 检测线程是否收到中断请求 */
return thread_ && thread_->interruption_requested();
}
/* 启动线程 */
void InternalThread::StartInternalThread()
{
/* 线程已启动,打印提示 */
if(is_started())
{
std::cout << "Threads should persist and not be restarted.";
}
try
{
/* 创建线程 */
thread_.reset(new boost::thread(&InternalThread::entry, this));
}
catch (std::exception& e)
{
std::cout << "Thread exception: " << e.what();
}
}
void InternalThread::InternalThreadEntry()
{
std::cout << thread_->native_handle()<< std::endl;
std::cout << thread_->get_id()<< std::endl;
int i = 0;
//while (!must_stop())
while(1)
{
i++;
sleep(1);
std::cout << "i = " << i << std::endl;
}
}
/* 线程处理单元 */
void InternalThread::entry()
{
InternalThreadEntry();
}
/* 终止线程 */
void InternalThread::StopInternalThread()
{
if (is_started())
{
/* 发送中断请求 */
thread_->interrupt();
try
{
/* 等待线程执行结束 */
thread_->join();
}
catch (boost::thread_interrupted&)
{
}
catch (std::exception& e)
{
std::cout << "Thread exception: " << e.what();
}
}
}
int main()
{
InternalThread testThread;
testThread.StartInternalThread();
std::cout << "hello world" << std::endl;
return 0;
}
需要先安装boost库,再编译:g++ test.cpp -lboost_system -lboost_thread