template//iterator 迭代器型別,t 內建資料型別
accumulate_block(iterator first, iterator last, t& result)
templatet parallel_accumulate(iterator first, iterator last, t init)
accumulate_block(block_start, last, results[num_threads - 1]);
for_each(threads.begin(),threads.end(),mem_fn(&thread::join));//阻塞等待執行緒結束
return std::accumulate(results.begin(), results.end(), init);//累加個執行緒結果並返回
}int main()
int sum = parallel_accumulate(vi.begin(), vi.end(), 5);//accumulate形參:首指標,尾指標,初始值
cout << "sum = " << sum << endl;
return exit_success;
}
三種方式實現數共享:
有鎖保護,對資料結構採用某種保護機制,確保只有進行修改的執行緒才能看到不變數被破壞時的中間狀態。
無鎖保護,對資料結構和不變數的設計進行修改,修改完的結構必須能完成一系列不可分割的變化,也就是保證每個不變數保持穩定的狀態,這就是所謂的無鎖程式設計。
事務形式,所需的一些資料和讀取都儲存在事務日誌中,然後將之前的操作合為一步,再進行提交。
避免死鎖的建議
使用固定順序獲取鎖:
在每個執行緒上,讓兩個互斥量總以相同的順序上鎖。
同時獲取所有資源,std::lock
要麼鎖住所有資源,要麼乙個都不鎖。
避免巢狀鎖:乙個執行緒已獲得乙個鎖時,別再去獲取第二個。
避免在持有鎖時呼叫使用者提供的**:
在持有鎖的情況下呼叫使用者**,而使用者**中可能有獲取其他鎖的操作。
使用鎖的層次結構:
當**試圖對乙個互斥量上鎖,在該層鎖已被底層持有時,上鎖是不允許的。
這裡需要另一種不同的互斥量,這種互斥量常被稱為「讀者-作者鎖」,因為其允許兩種不同的使用方式:
乙個「作者」
執行緒獨佔訪問和共享訪問,讓多個「讀者」
執行緒併發訪問。
對於更新操作,可以使用std::lock_guard
和std::unique_lock
上鎖。作為std::mutex
的替代方案,與std::mutex
所做的一樣,這就能保證更新執行緒的獨佔訪問。因為其他執行緒不需要去修改資料結構,所以其可以使用boost::shared_lock
獲取訪問權。
update_or_add_entry()
函式呼叫時,獨佔鎖會阻止其他執行緒對資料結構進行修改,並且阻止執行緒呼叫find_entry()
。
class dns_cache
void update_or_add_entry(std::string const& domain,
dns_entry const& dns_details)
};
C 併發程式設計實戰 閱讀筆記
1.當把函式物件傳入到執行緒建構函式中時,需要避免 最令人頭痛的語法解析 如果傳遞了乙個臨時變數,而不是乙個命名的變數 c 編譯器會將其解析為函式宣告,而不是型別物件的定義。例如 class background task background task f std thread my thread...
Java併發 JAVA併發程式設計實戰 讀書筆記3
發布乙個物件的意思是使它能夠被當前範圍之外的 所使用。比如將乙個引用儲存到其他 可以訪問的地方,在乙個非私有的方法中返回這個引用。在很多情況下,我們需要確保物件及它們的內部狀態不被暴露。乙個物件在尚未準備好時就將它發布,稱作逸出。最常見的發布物件的方式就是將物件的引用儲存到公共靜態域中,任何類和執行...
Java併發 JAVA併發程式設計實戰 讀書筆記8
為計算結果建立高效 可伸縮的快取記憶體 public inte ce computable public class expensivefunction implements computable public class memoizer1implements computable public ...