程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Unix C++(boost) 線程同步和線程組

Unix C++(boost) 線程同步和線程組

編輯:C++入門知識

#include
#include
#include
#include
#include

boost::mutex mutex;
boost::condition_variable_any cond;
std::vector random_numbers;

void fill()
{
std::srand(static_cast(std::time(0)));
for (int i = 0; i < 3; ++i)
{
boost::unique_lock lock(mutex);
random_numbers.push_back(std::rand());
cond.notify_all();
cond.wait(mutex);
}
}

void print()
{
std::size_t next_size = 1;
for (int i = 0; i < 3; ++i)
{
boost::unique_lock lock(mutex);
while (random_numbers.size() != next_size)
{
cond.wait(mutex);
}
std::cout << random_numbers.back()<<"---" << std::endl;
++next_size;
cond.notify_all();
}
}

int main()
{
boost::thread t1(fill);
boost::thread t2(print);
t1.join();
t2.join();
}

編譯後輸出:

703604841---
397897602---
2011646528---

這個例子的程序刪除了 wait()count() 。線程不用在每個循環迭代中等待一秒,而是盡可能快地執行。此外,沒有計算總額;數字完全寫入標准輸出流。

為確保正確地處理隨機數,需要一個允許檢查多個線程之間特定條件的條件變量來同步不每個獨立的線程。

正如上面所說, fill() 函數用在每個迭代產生一個隨機數,然後放在 random_numbers 容器中。 為了防止其他線程同時訪問這個容器,就要相應得使用一個排它鎖。 不是等待一秒,實際上這個例子卻用了一個條件變量。 調用 notify_all() 會喚醒每個哪些正在分別通過調用wait() 等待此通知的線程。

通過查看 print() 函數裡的 for 循環,可以看到相同的條件變量被 wait() 函數調用了。 如果這個線程被 notify_all() 喚醒,它就會試圖這個互斥量,但只有在 fill() 函數完全釋放之後才能成功。

這裡的竅門就是調用 wait() 會釋放相應的被參數傳入的互斥量。 在調用 notify_all()後, fill() 函數會通過 wait() 相應地釋放線程。 然後它會阻止和等待其他的線程調用 notify_all() ,一旦隨機數已寫入標准輸出流,這就會在 print() 裡發生。

注意到在 print() 函數裡調用 wait() 事實上發生在一個單獨 while 循環裡。 這樣做的目的是為了處理在 print() 函數裡第一次調用 wait() 函數之前隨機數已經放到容器裡。 通過比較 random_numbers 裡元素的數目與預期值,發現這成功地處理了把隨機數寫入到標准輸出流。




#include
#include

using namespace std;

void f1(){
cout<<"f1()"< }

void f2(){
cout<<"f2()"< }


int main(){
boost::thread_group grp;
for(int i=0;i<3;++i)
{
grp.create_thread(f1);
}
grp.add_thread(new boost::thread(f2));

cout<
grp.join_all();

return 1;
}

編譯後輸出:

4
f1()
f1()
f2()
f1()

這個程序演示了線程組的用法。





  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved