std::thread が値渡し: コピー コンストラクターが呼び出されます
問題:
に引数を渡すときstd::thread を使用するスレッドが参照渡しでコピー コンストラクターを呼び出しているようです。これは、渡されたクラスに無効なコピー コンストラクターがある場合に発生します。
説明:
デフォルトでは、std::thread は引数を値で受け取ります。関数シグネチャ内に参照が表示されているにもかかわらず、引数は実際にはスレッド オブジェクトにコピーされます。この例では、Log クラスのコピー コンストラクターが無効になっているため、参照渡し時にコンパイラ エラーが発生します。
解決策: std::reference_wrapper:
To による参照セマンティクス参照セマンティクスを実現するには、std::reference_wrapper を使用してオブジェクトをラップし、スレッドに渡します。これにより、コピーを作成せずに元のオブジェクトへの参照が効果的に渡されます:
std::thread newThread(session, &sock, std::ref(logger));
スレッド関数宣言:
std::ref を使用するには、対応するスレッド関数を変更する必要がありますstd::reference_wrapper:
static void session(tcp::socket *sock, std::reference_wrapper<Log> logger) { std::cout << " session () " << std::endl; }
ライフタイムを受け入れるには管理:
ダングリング参照を避けるために、渡されたオブジェクト (この場合はロガー) がスレッドよりも存続するようにすることが重要です。
以上が参照渡し時に `std::thread` がコピー コンストラクターを呼び出しているように見えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。