2016-04-24 22 views
1

systemの呼び出しを並列に実行したいが、f1.get()を呼び出しても、以下の行の対処は行われない。このコードで何が問題になっていますか?get()が呼び出されても未来が実行されない

auto f1 = std::async(system, string("cp a b").c_str()); 
f1.get(); // there is still no file "b". 

注:私は、私は別の文字列から一緒に引数を入れて使用していますので、私の実際のコードにstring(...).c_str()を書きました。

+3

'string(" cp a b ")。c_str()は実行時に' system'へのダングリングポインタを渡します。 – melak47

+0

一方、文字列リテラルは存続します。 'std :: async(system、" cp a b ")' –

+0

コードが動作するようです。おそらく、「システム」への引数が構築される方法にはいくつかの問題があります。 –

答えて

2

はあなたのコマンドを含むstd::stringが一時オブジェクトであり、唯一の時間systemによってそう 、std::asyncコールの最後まで生きるだろうが呼び出され、ポインタが動作するように起こる可能性がある、削除されたメモリを参照する、またはそれもrm -rf/--no-preserve-rootと表示される可能性があります。これは未定義の動作です。

文字列オブジェクトが十分に長く存続するようにする必要があります。あなたの例では十分に簡単ですが、非同期操作を開始する場合は必ずしもそうとは限りません。

C++ 11個のラムダ式は正確に限り、我々はそれを必要とするために私たちに良い方法ストア文字列を与える:

また
std::string command = "cp main.cpp b"; 

auto f1 = std::async(std::launch::async, 
    [command]{ // copy command into the closure 
     std::system(command.c_str()); 
    } 
); 

、あなたはasync起動ポリシーを要求していないことに注意してくださいので、あなたの関数は同時に同期して実行することができます。

サイドノート:外部プロセスを起動していて、出力、終了ステータスなどをキャプチャしたい場合は、POCO's Processのようなものを使用することを検討してください。

関連する問題