一.boost::thread的创建
1.线程创建方法一:
boost::shared_ptr<boost::thread> writeThread_;
boost::function0<void> f = boost::bind(&DBTaskMgr::execute, this);
writeThread_ = boost::shared_ptr<boost::thread>(new boost::thread(f));
2.线程创建方法二:
boost::thread myThread(threadFun); //函数无参数,并返回void类型
3.放弃时间片:
boost::thread::yield();
当前线程放弃余下的时间片。
4.等待一个线程:
myThread.join();
注:调用这个方法的线程进入wait状态,直到myThread代表的线程完成为止。如果它不结束的话,join方法就不会返回。join是一个等待子线程结束的最好的方法。
如果主程序不调用join方法而直接结束,它的子线程有可能没有执行完成,但是所有的子线程也随之退出。不调用join方法,主线程就不会等待它的子线程。
二.从一个线程中给另一个线程发送通知
当需要线程等待某个事物时,可以创建一个condition对象,然后通过这个对象来通知那些等待的线程。
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/mutex.hpp>
boost::shared_ptr<boost::thread> writeThread_;
boost::mutex taskMutex_;
boost::condition_variable taskCond;
bool taskReady = false;
while(true)
{
{
boost::unique_lock<boost::mutex> lock(taskMutex_); //锁定taskMutex_对象
while (!taskReady)
{
taskCond.wait(lock); //解开这个taskMutex_上的锁,然后进行等待或者休眠,直到它的条件得到了满足
}
taskReady = false;
}
...............................................
......
}
void DBTaskMgr::enqueueTask(IDBTask * task)
{
taskQueMutex_.lock();
taskQue_.push_back(task);
taskQueMutex_.unlock();
{
boost::unique_lock<boost::mutex> lock(taskMutex_);
taskReady = true;
}
taskCond.notify_one(); //解除线程等待或休眠
//taskCond.notify_all(); //解开所有线程等待或休眠
}
.....................................