型を明示的に使用する
警告を生成する移植性の問題のほとんどは、型に注意を払わなかったために発生します。標準ライブラリと配列はsize_t
インデックスとして型を使用し、標準コンテナ サイズはsize_t
型を使用します。size_t が正しく処理されない場合、最初の 32 ビット整数インデックスのオーバーフロー後にのみ現れる微妙な 64 ビットの問題が潜んでいる可能性があります。もう 1 つの同様の問題は、char
型とunsigned char
型の使用です。
標準ライブラリを使用する
std::filesystem
C++17 では、filesystem
サポートされているすべてのコンパイラでポータブル ファイル システムへのアクセスを提供する新しいライブラリが追加されています。
std::thread
C++11 のスレッド機能は、それに基づくことpthread
も、WinThreads
使用することもできます。
他の
このシリーズの他の問題のほとんどは、最終的には移植性、特に静的型を避けることに注意することに帰着します (以下のマルチスレッドのセクションを参照)。
マルチスレッド化
グローバルデータを避ける
グローバル データは関数間で予期しない副作用を引き起こす可能性があり、コードの並列化が困難になったり、不可能になったりする可能性があります。たとえ現在のコードが並列化されるように書かれていないとしても、将来的には決して並列化すべきではないという理由はありません。
静的データ
グローバル データであることに加えて、静的データは、特にクロスプラットフォーム環境では、常に期待どおりに構築および破棄されるわけではありません。たとえば、動的モジュールからロードされた共有静的データの破棄順序に関する g++ のバグ[2]があります。
共有ポインタ
std::shared_ptr
グローバル変数と同様に、複数のコードが同じデータを操作できるようにします。
シングルトン
シングルトンは通常、静的であるかshared_ptr
実装されています。
ヒープ操作を避ける
マルチスレッド環境ではヒープ操作ははるかに遅くなり、move
そのような操作は言うまでもなく、多くの場合、またはほとんどの場合、データのコピーの方が高速になります。
ミューテックスと可変オブジェクトを一緒に使用する (M&M ルール、C++11)
メンバー変数の場合は、両方向に機能するミューテックスと可変変数の両方を使用することをお勧めします。
-
可変メンバー変数は共有変数であると想定されるため、ミューテックス ロックと同期 (または原子化) する必要があります。
-
メンバー変数自体が相互排他的である場合、そのメンバー変数は変更可能でなければなりません。これは、それを const メンバー関数で使用するために必要です。