併發程式設計實戰筆記

2021-10-20 20:04:27 字數 1696 閱讀 2026

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_guardstd::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 ...