C++11以降の標準では、新しいスレッドライブラリが導入されました。このライブラリには、スレッドを開始・管理するためのユーティリティが含まれています。また、ミューテックスやその他のロックなどの同期プリミティブ、アトミック変数と関連ユーティリティも提供されます。
C++で並行性を管理する標準的な方法ができたことは、大きな進歩です。これらの機能が導入される以前、C++プロジェクトは並行性を扱うために、さまざまなライブラリやアプローチに依存していました。
この記事では、Rainer Grimm著「Concurrency with Modern C++」を読む利点を見ていきます。
実践的なアプローチ
コンピュータサイエンスの書籍には、主に学生を対象とした学術的なものもあれば、製品を構築する際の現実の問題を解決するための実践的な指針を必要とする開発者向けのものもあります。この書籍は実践的なアプローチを採用しており、冒頭からサンプルパッケージを参照し、そのコンパイル方法を説明しています。目的は、書籍で提供される各解決策を実際に試すことです。
冒頭で全体像を把握できる
一般に、目次を見て序文を読めば、書籍の内容をある程度把握できます。しかし多くの場合、それだけでは書籍の目標を明確に理解するには不十分です。
この書籍の興味深い点は、問題、解決策、新しい標準が提供する機能を明確に説明する8ページの「Quick Overview」セクションがあることです。
明確に説明されたメモリモデル
Quick Overviewから、メモリモデルの制約が明確に説明されています。
マルチスレッドの基盤は、明確に定義されたメモリモデルです。このメモリモデルは、次の側面に対処する必要があります。• アトミック操作:中断されずに実行できる操作。• 操作の部分的順序付け:並べ替えてはならない操作の順序。• 操作の可視的効果:共有変数に対する操作が、他のスレッドでいつ可視になるかの保証。
メモリモデルに特化したセクションでは、著者がメモリ制約を詳細に分析し、並行シナリオにおけるメモリの扱いを理解しやすくする多数のコードサンプルを提供しています。さらに有用なのは、問題とその解決策を説明するために使われている図解です。
このセクションでは、並行プログラムでメモリを扱うために新しい標準が提供する機能も紹介しています。
マルチスレッドの謎を解く
マルチスレッドプログラムを書く多くのプログラマーは、多数のスレッドを作成して、とりあえず動くようにする方法を学びます。しかし、その後スレッドが完全に制御不能になり、プログラマーはどう対処すればよいか分からなくなります。そうなると、バグの修正やコードの追加が頭痛の種になります。1つのバグを修正することが、別の多くのバグを生み出すこともあります。
したがって、本番コードでマルチスレッドを使用する前に、その基礎を習得しておくことが推奨されます。幸い、C++にはC++11以降、マルチスレッドインターフェースがあり、このインターフェースにはマルチスレッドプログラムを作成するための基本的な構成要素がすべて揃っています。スレッドを扱う標準的な方法がある方が望ましいです。
この書籍のMultithreadingセクションの強みは、段階的なアプローチにあります。そのため、スレッドにまだ慣れていない初心者にも有用です。このセクションは、経験豊富なC++開発者にもお勧めします。私自身、長年スレッドを扱ってきた後でも、興味深い詳細や新しい機能をいくつか発見しました。
メモリモデルのセクションと同様に、多数のコードサンプルと図解が、マルチスレッドの概念を理解しやすくしています。
理論を実践するケーススタディ
メモリモデルとマルチスレッドインターフェースに関する理論を提示した後、著者はそれを実践へ適用し、いくつかの性能数値も示しています。
ケーススタディは、ベクトルの合計を計算する例のように、追いやすいものです。著者は、現代的なC++機能で利用できるさまざまな実装選択肢についても詳しく説明しています。
最初のケーススタディを読んで実践すれば、多くの並行性の問題と、それらへの対処方法を実践的に理解できるようになります。C++の並行性を習得したいすべての開発者に、このケーススタディをお勧めします。
最後に課題とベストプラクティス
メモリモデルとマルチスレッドを取り上げ、ケーススタディを通じてそれらを強化した後、著者はいくつかの興味深い課題を提示しています。それらを含めた動機は次のとおりです:
並行プログラミングは本質的に複雑です。特にC++11とC++14の機能を使用する場合には、その傾向が強くなります。私はまだメモリモデルについてさえ説明していません。並行プログラミングの課題に丸ごと1章を割けば、読者が落とし穴をより強く意識できるようになることを期待しています。
著者は、並行性に対処するためのいくつかのベストプラクティスも提供しています。彼が説明しているとおりです:
この章では、現代的なC++で、明確に定義された高速な並行プログラムを書くための単純な一連のルールを提供します。マルチスレッド、特に並列性と並行性は、C++にとってかなり新しい話題です。したがって、今後数年でさらに多くのベストプラクティスが発見されるでしょう。この章のルールは完全なリストとしてではなく、時間とともに進化していく必要な出発点として捉えてください。
結論
この書籍を読むと、著者がC++プロジェクトの現実の問題を解決してきた豊富な経験を持つプログラマーであることが明らかになります。それが、この書籍の実践的なアプローチを説明しています。現代的なC++で並行性を習得したいすべての開発者にお勧めできる書籍です。
