我們知道,我們無法預測thread執行的先後,這代表的是任何一個thread都有可以在任何的時間點從CPU上取得操作權。這不僅會造成cout時文字無法連續,同時在操作資料時,最害怕的情形是『同時』有多個thread去對『同一個資料』做更改,因為他會造成運算結果的錯誤。這個特性,在電腦科學裡面稱作race condition,進而導致了需要保證thread-safety的問題。
在boost裡提供了mutex機制來解決(Critical Section Problem)
一個簡單的demo:
#include <boost/thread.hpp> #include <iostream> void wait(int seconds) { boost::this_thread::sleep(boost::posix_time::seconds(seconds)); } boost::mutex mutex; int gValue = 0; void thread(int i) { wait(1); mutex.lock(); gValue = gValue + i; std::cout < < "Thread :" << boost::this_thread::get_id() << ": gValue + " << i << " =" << gValue << std::endl; mutex.unlock(); } int main() { boost::thread t1(boost::bind(&thread, 1)); boost::thread t2(boost::bind(&thread,2)); t1.join(); t2.join(); std::cout << "finally gValue:" << gValue << std::endl; system("pause"); }
當我們下了mutex.lock(); 之後,所有的thread都會停止,直到mutex.unlock();
lock主要分為exclusive locks及non-exclusive locks等二種。
例如:
boost::mutex
boost::lock_guard
boost::unique_lock
boost::unique_lock
boost::shared_lock
在thread programming中,還有一個重要的概念:Thread Local Storage,說明我們該怎麼樣把原本宣告成會所有thread共享的全域或靜態變數的變數,變成每個thread會保有一份的local變數。在boost中,提供了boost::thread_specific_ptr來實現這個概念,以下為一個簡單的範例:
#include <boost/thread.hpp> #include <iostream> #include <cstdlib> #include <ctime> boost::thread_specific_ptr tls; void thread(int i){ tls.reset(new int(i)); } int main() { boost::thread t[3]; tls.reset(new int(1)); for (int i = 0; i < 3; ++i) t[i] = boost::thread(boost::bind(&thread, i)); for (int i = 0; i < 3; ++i) t[i].join(); std::cout << *tls.get() << std::endl; system("pause"); }
Leave a Reply