ActionMgr.h
#ifndef ACTIONMGR_H_
#define ACTIONMGR_H_
#include <boost/thread/recursive_mutex.hpp>
#include <boost/thread/thread.hpp>
class ActionMgr
{
public:
ActionMgr();
virtual ~ActionMgr();
bool startThread();
void doSomeThing();
void kill();
private:
boost::recursive_mutex mutex_;
boost::condition_variable_any cond_;
boost::shared_ptr<boost::thread> actionThr_;
static bool actionThread(void *content);
};
#endif
ActionMgr.cpp
#include "ActionMgr.h"
#include <iostream>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using std::cout;
using std::endl;
ActionMgr::ActionMgr() : mutex_(), cond_()
{
}
ActionMgr::~ActionMgr()
{
if (actionThr_->get_id() != boost::thread::id())
{
actionThr_->interrupt();
actionThr_->join();
}
}
bool ActionMgr::startThread()
{
actionThr_.reset(new boost::thread(boost::bind(actionThread, this)));
if (!actionThr_.get())
return false;
return true;
}
void ActionMgr::doSomeThing()
{
cout << "------>>>>>>>>>>" << endl;
}
bool ActionMgr::actionThread(void *content)
{
if (NULL == content)
return false;
ActionMgr *mgr = (ActionMgr *)content;
try
{
for (;;)
{
mgr->doSomeThing();
boost::lock_guard<boost::recursive_mutex> lock(mgr->mutex_);
if (mgr->cond_.timed_wait(mgr->mutex_, boost::posix_time::milliseconds(1000)))
cout << "wait successfully" << endl;
else
cout << "wait timeout" << endl;
}
}
catch (boost::thread_interrupted &)
{
}
return true;
}
test.cpp
#include "ActionMgr.h"
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
ActionMgr mgr;
mgr.startThread();
boost::this_thread::sleep(boost::posix_time::milliseconds(5000));
return 0;
}
Makefile
main: *.cpp *h
g++ -W -Wall test.cpp ActionMgr.cpp ActionMgr.h -lboost_thread -lboost_date_time -o main
#ifndef ACTIONMGR_H_
#define ACTIONMGR_H_
#include <boost/thread/recursive_mutex.hpp>
#include <boost/thread/thread.hpp>
class ActionMgr
{
public:
ActionMgr();
virtual ~ActionMgr();
bool startThread();
void doSomeThing();
void kill();
private:
boost::recursive_mutex mutex_;
boost::condition_variable_any cond_;
boost::shared_ptr<boost::thread> actionThr_;
static bool actionThread(void *content);
};
#endif
ActionMgr.cpp
#include "ActionMgr.h"
#include <iostream>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
using std::cout;
using std::endl;
ActionMgr::ActionMgr() : mutex_(), cond_()
{
}
ActionMgr::~ActionMgr()
{
if (actionThr_->get_id() != boost::thread::id())
{
actionThr_->interrupt();
actionThr_->join();
}
}
bool ActionMgr::startThread()
{
actionThr_.reset(new boost::thread(boost::bind(actionThread, this)));
if (!actionThr_.get())
return false;
return true;
}
void ActionMgr::doSomeThing()
{
cout << "------>>>>>>>>>>" << endl;
}
bool ActionMgr::actionThread(void *content)
{
if (NULL == content)
return false;
ActionMgr *mgr = (ActionMgr *)content;
try
{
for (;;)
{
mgr->doSomeThing();
boost::lock_guard<boost::recursive_mutex> lock(mgr->mutex_);
if (mgr->cond_.timed_wait(mgr->mutex_, boost::posix_time::milliseconds(1000)))
cout << "wait successfully" << endl;
else
cout << "wait timeout" << endl;
}
}
catch (boost::thread_interrupted &)
{
}
return true;
}
test.cpp
#include "ActionMgr.h"
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
ActionMgr mgr;
mgr.startThread();
boost::this_thread::sleep(boost::posix_time::milliseconds(5000));
return 0;
}
Makefile
main: *.cpp *h
g++ -W -Wall test.cpp ActionMgr.cpp ActionMgr.h -lboost_thread -lboost_date_time -o main