1. 程式人生 > >Boost中實現線程安全

Boost中實現線程安全

pen {} blank tex con sleep href ++ for

博客轉載自: http://www.cnblogs.com/lvdongjie/p/4447142.html

1 boost原子變量和線程

#include <boost/thread.hpp>
using namespace boost;
using namespace std;

mutex io_mu; // 定認全局互斥變量

/*
* 模板類: 線程安全的計數器,不可拷貝
*/
template<typename T>
class basic_atom : noncopyable
{
private:
    T n;
    mutex mu;
public:
    basic_atom(T x 
= T()) :n(x) {} T operator++() { mutex::scoped_lock lock(mu); //用scoped_lock鎖住成員互斥信號變量 return ++n; } operator T() { return n; } }; typedef basic_atom<int> atom_int; // 將模板類定義精簡名atom_int int to_interrupt(atom_int& x, const string& str) { try {
for (int i = 0; i < 9; ++i) { this_thread::sleep(posix_time::seconds(1)); // 此處應該是子線程sleep1秒 mutex::scoped_lock lock(io_mu); //io流非線程安全,必須鎖住 cout << str << ": " << ++x << endl; } } catch (thread_interrupted&) { cout
<< "thread interrupted" << endl; return -1; } return 0; } int main() { atom_int x; thread t(to_interrupt, boost::ref(x), "hello"); // t調用to_interrupt函數,並輸出hello x this_thread::sleep(posix_time::seconds(3)); //此處應該是主線程睡眠3秒 t.interrupt(); // 調用線程的中斷操作 t.join(); // 因為線程已中斷,所以線程立即返回 getchar(); return 0; }

t.join()作用
一句話:把當前線程合並到主線程
詳細點:
程序的入口點是Main函數
主程序定義了一個線程,這個線程是執行一個延時輸出“--”的函數
如果沒有這句join,那麽程序就會一邊執行輸出“--”一邊執行主程序下面的代碼
有了這個join 意思就是大家都在一條線上了,我執行完了才輪到主程序執行。

Boost中實現線程安全