マルチスレッド環境で C 関数のデフォルト パラメーターと可変パラメーターを使用する場合は、スレッド セーフの問題を必ず考慮してください。デフォルト パラメータ: デフォルト パラメータが不変 (整数や文字列リテラルなど) の場合、それらは変更できないためスレッドセーフです。変数パラメーター: 変数パラメーターはスレッドのローカル ストレージにコピーでき、データ競合を避けるために各スレッドに独立したコピーがあります。
マルチスレッド環境における C 関数のデフォルトパラメータと可変パラメータの使用戦略
マルチスレッド環境で使用する場合C 関数のデフォルトパラメータと可変パラメータを使用する場合は、スレッドの安全性の問題を考慮する必要があります。これは、デフォルト パラメーターと可変引数パラメーターの両方が関数スタック フレームに格納され、複数のスレッドが同じ関数を同時に呼び出すと、同じメモリ空間を使用してデータ競合が発生する可能性があるためです。
デフォルト パラメーターのスレッドセーフな使用
デフォルト パラメーターは、関数が定義され、関数スタック フレーム内の既知の場所に保存されるときに初期化されます。したがって、デフォルト パラメータが不変の場合 (整数や文字列リテラルなど)、変更できないため、スレッド セーフになります。
int sum(int a, int b = 0) { return a + b; }
上記の例では、b
は不変のデフォルト パラメータであるため、マルチスレッド環境で安全に使用できます。
可変パラメータのスレッドセーフな使用
可変パラメータは、関数スタック フレームの動的に割り当てられたメモリ領域に格納されます。複数のスレッドが可変引数を指定して関数を同時に呼び出すと、同じメモリ空間が使用され、データ競合が発生する可能性があります。
この問題を解決するには、変数パラメータをスレッドのローカル ストレージにコピーします。スレッド ローカル ストレージはコンパイラによって管理される特別なメモリ領域であり、各スレッドは独自のコピーを持ちます。
#include <thread> #include <vector> void sum_array(std::vector<int>& data) { int sum = 0; for (int x : data) { sum += x; } printf("Sum: %d\n", sum); } int main() { std::vector<int> data = {1, 2, 3, 4, 5}; std::vector<std::thread> threads; for (int i = 0; i < 4; i++) { threads.emplace_back(sum_array, data); // 每个线程拥有自己的 data 副本 } for (auto& t : threads) { t.join(); } return 0; }
この例では、data
は各スレッドのスレッドローカル ストレージにコピーされる可変個引数です。これにより、各スレッドが data
の独自の独立したコピーを持つようになり、データ競合が回避されます。
以上がマルチスレッド環境で C++ 関数のデフォルト パラメーターと変数パラメーターを使用するための戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。