Boost中實現線程安全
阿新 • • 發佈:2017-12-26
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中實現線程安全