boost::thread多线程
2017-03-13 本文已影响0人
变胖是梦想2014
1.thread库简介
thread库依赖chrono库。chrono库是C++11新加入的方便日期时间操作的标准库,thread库需要chrono库提供的时间概念来执行睡眠、等待操作,因此编译thread库需要先编译chrono库。
thread位于命名空间boost,包含于头文件<boost/thread/thread.hpp>中:
#define BOOST_THREAD_BERSION 4 //最新版本
#include <boost/thread/thread.hpp>
using namespace boost;
在C++标准之外,thread库还提供了大量的扩展功能,但是出于对兼容性的考虑,这些功能包含在其他的头文件中:
#include <boost/thread/lock_factories.hpp>
#include <boost/thread/lockable_adapter.hpp>
#include <boost/thread/lockable_concepts.hpp>
#include <boost/thread/thread_guard.hpp>
#include <boost/thread/scoped_thread.hpp>
#include <boost/thread/shared_lock_guard.hpp>
2.A simple example
#include <boost/thread/thread.hpp>
#include <iostream>
void hello()
{
std::cout<<"Hello multi-thread!"<<std::endl;
}
int main(int argc,char* argv[])
{
boost::thread thrd(&hello);
thrd.joid();
return 0;
}
这个例子中,main函数是一个线程,新建的线程用于输出“hello multi-thread!”。同时调用boost::thread::join()来等待线程执行结束。
3.互斥体
多线程程序要避免不同的线程同时访问共享区域。为了避免多个线程多共享区域的同时访问,产生了互斥体(mutex,mutual extension的缩写),一个互斥体一次只允许一个线程访问共享区。当一个线程想要访问共享区时,首先要锁住(lock)互斥体,互斥体一旦被锁住,其他线程想要再访问共享区,只能等到当前线程结束,解锁互斥体。
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/bind.hpp>
#include <iostream>
boost::mutex io_mutex;
void count(int id)
{
for(int i = 0;i < 10; i++)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout<<id<<":"<<i<<std::endl;
}
}
int main(int argc,char* argv[])
{
boost::thread thrd1(boost::bind(&count,1));
boost::thread thrd2(boost::bind(&count,2));
thrd1.join();
thrd2.join();
return 0;
}
不明白怎么用boost::bind(),可以参考我的文章boost::bind函数绑定器一文。
多线程的内容太多了,待我慢慢来写。未完待续。