
284
|
7 章 並行 API
•
std::promise と future を用いた設計では上記問題点を回避できるが、共有ステート用の
ヒープメモリを消費する。さらに通信が 1 度切りという制限がある。
項目 40:並行処理には std::atomic を、特殊メモリには volatile
を用いる
可哀想なことに volatile はとても誤解されています。そもそも並行プログラミングに関係しな
いのですから、本章に含めるべきでもありません。しかし、他のプログラミング言語では(Java や
C# など)、volatile は並行プログラミングで重宝されるものです。また、並行ソフトウェアに適用
可能なセマンティクスを volatile に持たせる C++ コンパイラもあります(もちろん、そのコンパ
イラでコンパイルした場合に限られる)。そのため、volatile にまつわる混乱の一掃を目的とし、
並行 API を主題とする本章でとりあげる意味があるのです。
プログラマが volatile 紛れもなく本章で解説する機能 とたびたび混同する C++ 機能
が std::atomic テンプレートです。std::atomic テンプレートをインスタンス化すると(std::
atomic<int>、std::atomic<bool>、std::atomic<Widget*> など)、他スレッドから見てアトミッ
クな動作を保証できます7。std::atomic オブジェクトをコンストラクトすると、このオブジェク
トに対する処 ...