Boost中有两个用于并发编程的组件。首先是thead库:它为C++增加了可移植的线程处理能力。然后是一个用于同步和异步IO操作的功能强大的库——asio,它使用了前摄器模式,可以处理串口,网络通信,而且有望成为C++标准底层通信库。
互斥量是一种用于线程同步的手段,它可以在线程编程中防止多个线程同时操作共享资源(或称临界区)。一旦一个线程锁定了互斥量,那么其他线程必须等待他解锁互斥量才能在访问共享资源。thead提供了7中互斥量类型(实际只有五种):
- mutex 独占式互斥量
 - try-mutex mutex 同义词
 - timed_mutex 独占式互斥量,提供超时锁定功能
 - recursive_mutex 递归式互斥量,可以多次锁定,相应也要多次解锁
 - recursive_try_mutex recursive_mutex 同义词
 - recursive_time_mutex 递归式互斥量,基本功能同 recursive_mutex ,提供超时锁定功能
 - shared_mutex multi-reader/single-writer 型共享互斥量 读写锁
 
mac下使用 boost thread 需要将 libboost_thread.dylib libboost_thread-mt.dylib lib boost-system.dylib 加入到工程,链接进工程。
具体用法:
#include <iostream>
#include <string>
#include <boost/assign.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/assign.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/ref.hpp>
#include <boost/bind.hpp>
using namespace boost;
using namespace std;
#define BOOST_DATE_TIME_SOURCE
#define BOOST_THREAD_NO_LIB
// 模板类配合模板参数提供不同范围的计数,提供隐式类型转换操作
// 在多线程环境下安全计数
template <typename T>
class basic_atom: noncopyable {
private:
    T n;
    typedef boost::mutex mutex_t;
    mutex_t mu;
public:
    basic_atom(T x = T()):n(x) {}
    T operator++(){
        mutex_t::scoped_lock lock(mu);
        return ++n;
    }
//    T operator=(const T _n){
//        mutex_t::scoped_lock lock(mu);
//        n = _n;
//        return _n;
//    }
    operator T()    {return n;}
};
boost::mutex io_mu;
typedef basic_atom<int> atom_int;
void printing(atom_int& x, const string& str){
    for (int i = 0;  i < 5; ++i) {
        boost::mutex::scoped_lock lock(io_mu);
        cout << str << ++x <<endl;
    }
}
void to_interrupt(atom_int& x, const string& str){
    try {
        for (int i = 0;  i < 5; ++i) {
            this_thread::sleep(posix_time::seconds(1));
            boost::mutex::scoped_lock lock(io_mu);
            cout << str << ++x <<endl;
        }
    } catch (thread_interrupted& ) {
        cout << "thread_interrupted" <<endl;
    }
}
int main(int argc, const char * argv[]) {
    cout << "start" <<endl;
    this_thread::sleep(posix_time::seconds(2));
    cout << "sleep 2 seconds" <<endl;
    boost::mutex mu;
    try {
        mu.lock();
        cout << "do some operations" << endl;
        mu.unlock();
    } catch (...) {
        mu.unlock();
    }
    boost::mutex mu1;
    boost::mutex::scoped_lock lock(mu1);
    cout << "some operations" <<endl;
    atom_int x;
    thread t1(printing, boost::ref(x), "hello");
//    this_thread::sleep(posix_time::seconds(2));
    // join & timed_join
    if (t1.joinable()) {
        t1.join();          // 等待t1 线程结束再返回,不管执行多长时间
    }
    thread t2(printing, boost::ref(x), "boost");
    t2.timed_join(posix_time::seconds(1));      // 最多等待1秒返回
    thread t(to_interrupt, boost::ref(x), "interrupt");
    this_thread::sleep(posix_time::seconds(4));
    t.interrupt();
    t.join();
    return 0;
}
asio
Boost.Asio是一个跨平台的、主要用于网络和其他一些底层输入/输出编程的C++库。以下代码实现一个简单的tcp服务,访问http://localhost:6688可得到字符.
#include <iostream>
#include <string>
#include <boost/assign.hpp>
#include <boost/typeof/typeof.hpp>
#include <boost/assign.hpp>
#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/asio.hpp>
using namespace boost;
using namespace std;
int main(int argc, const char * argv[]) {
    using namespace boost::asio;
    try {
        io_service ios;
        ip::tcp::acceptor acceptor(ios, ip::tcp::endpoint(ip::tcp::v4(), 6688));
        cout << acceptor.local_endpoint().address() << endl;
        while (true) {
            ip::tcp::socket sock(ios);
            acceptor.accept(sock);
            cout << "client:" ;
            cout << sock.remote_endpoint().address() << endl;
            sock.write_some(buffer("hello asio"));
        }
    } catch (std::exception& e) {
        cout << e.what() << endl;
    }
    return 0;
}
更多 boost.asio 相关内容查看C++ 网络编程