#include 編譯後輸出: 703604841--- 這個例子的程序刪除了 為確保正確地處理隨機數,需要一個允許檢查多個線程之間特定條件的條件變量來同步不每個獨立的線程。 正如上面所說, 通過查看 這裡的竅門就是調用 注意到在 #include 4 這個程序演示了線程組的用法。
#include
#include
#include
#include
boost::mutex mutex;
boost::condition_variable_any cond;
std::vector
void fill()
{
std::srand(static_cast
for (int i = 0; i < 3; ++i)
{
boost::unique_lock
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
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();
}
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
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;
}
編譯後輸出:
f1()
f1()
f2()
f1()