2017-06-29 9 views
2

Visual Studioを2013から2017に更新しました。 コンパイルは正常でしたが、std :: async呼び出しが新しいスレッドを開かなかったようです。 (デバッグ中に私は、スレッドのウィンドウで、新しいものを参照してくださいカントも、それは非同期関数が仕事をしていません呼び出すスレッドのように見えます...。)私の関数呼び出しVS2013からVS2017へstd :: asyncは新しいスレッドを開始しません

つまり:

std::async(std::launch::async, myfunction, this); 
は、

私は自分のコードで何も変えなかったし、VS2013ではうまくいっていた。

Googleはこれについて多くのことを教えてくれませんが、間違ったキーワードを持っている可能性があります。キーワードも役立ちます!

あなたは

+0

あなたがリリースまたはデバッグビルドでテストされていますか? –

+0

@FrançoisAndrieuxDebug – TheRealLife

+0

'myfunction'にブレークポイントを配置すると、ワーカースレッドでブレークポイントが実行されていることがわかります。 –

答えて

0

非常にシンプルなソリューションである必要があります。

std::thread t(myfunction, this); 
t.detach(); 
7

あなたが作業が終了するまでブロックします一時的なのasyncそれ以外の場合はデストラクタで返さstd::futureを保持する必要がありますありがとうございました。

auto t = std::async(std::launch::async, myfunction, this); 
+2

あなたはstd :: futureを意味しますか? –

+0

@ manni66です。 thanks – Simple

+0

メインコードと非同期コードで 'std :: this_thread :: get_id()'を調べたり、ダンプして実際に何が起こっているのか調べてみてください。 – Persixty

5

VS2013では、std::asyncはC++標準に準拠していません。

MSVCで作業している開発者は、std::asyncstd::futureが他のすべてと同様に動作するようにしたいとの意見がありましたstd::future

規格には異論があります。

彼らは2013年に非標準準拠のstd::futureをリリースしました.2015年に正しく覚えていれば、彼らは標準に準拠し始めました。

標準では、std::async(std::launch::asyncによって生成された共有状態を所有するstd::futureのデストラクタが、タスクが完了するまでブロックされることを示しています。

これは、予測可能な振る舞いをするプログラムでは、実際にはスレッドが絡んでいるためです。あなたはfutureを所有し、持続の担当に今ある

は、あなたがそれを準備する必要がある場合にそれをINGの

auto f = std::async(std::launch::async, myfunction, this); 

f.waitまたはf.getから返されました。

コードの変更方法が必要な場合があります。 (複数の場合は)先読みベクトルを保持するか、またはstd::future<?>メンバをthisに追加して保存します(これにより、非同期呼び出しがオブジェクトの存続期間を超えないようにすることもできます)。 2番目の音符として


は、Windows上の std::asyncも有界スレッドプールを使用しています。特定の数以上の asyncタスクがアクティブな場合、新しいタスクが起動されないことがあります。

彼らはそれを修正する計画があります(これは標準のアドバイスに反します)。しかし、この時点ではstd::threadを使用することをお勧めします。std::asyncのような動作が必要です。

私の個人的な傾向がstd::thread秒の一定数を所有し、問題固有のthread_pool Sを作成していますが、タスクをキューに入れましょうと戻ってそれからfuture S(私は非常に限られた継続能力を与えるカスタム拡張子を持つ)を取得することです。

スレッド所有権と依存関係をより明示的にし、依然として存在するMSVC非標準準拠の処理を回避します。

+1

これは優れた答えです。何をする必要があるのか​​、さらに詳しく説明するだけでなく、* why *も説明しています。 upvotesの相対的な不足は私に困惑しています。 –

0

std :: asyncのように見えます。したがって、symplyを呼び出すと、非同期では動作しません。

std::async(std::launch::async, myfunction, this); 

キーは答えを定義しています:myfunctionはstd :: futureを返さなければならず、応答と同じ型を定義する必要があります。

std::future<int> foo = std::async(std::launch::async, myfunction, this); 

コンストラクタ内でstd :: asyncを呼び出す場合、fooはクラスのメンバーである必要があります。

class MyClass { 
    //Your code 
    private: 
     std::future<int> exitThread; 
} 

そして、あなたがSTDを呼び出す::非同期は

exitThread = std::async(std::launch::async, myfunction, this); 
関連する問題