0

私は現在、ハーブサッターのプレゼンテーションに基づいて、並行オブジェクトで遊んでいます。私は現在、11月のCTPでVisual Studio 2012を使用しています(以下の内容を別の方法で確認できませんでした。Clangはdecltypesのクラスメンバーが好きではなく、g ++はWindowsでは何も好きではありませんでした)。

そうすることで、thread-idが-1であるという奇妙なバグに直面しました。次のコードを検討してください。

__workerThread([=]() -> void {    
    std::cerr << std::endl; 
    while (!__done) 
    { 
        this->__innerqueue.pop()(); 
    }    
})

これは、ラムダ関数を使用したaの初期化にstd::threadすぎません。見事なことは何もないと思いました。ただし、std :: cerrの呼び出しを強制する最初の行(最適化なし)がない場合、このスレッドのIDは(デバッガーのために)-1のように見えますが、そうでない場合は、そうあるべきです。

このスレッドIDの問題は、実行時に発生します

std::unique_lock<std::mutex> lock(this->__accessMutex);

メッセージキュー内。下位API(mutex.c)のどこかでクラッシュするため。

誰かがこの奇妙な行動を引き起こす可能性のあるものを知っていますか?に呼び出しを追加することstd::cerrは、今のところ厄介な回避策であり、私はそれを取り除きたいと思います...

いろいろ試してみたい場合は、 Githubで完全なソースを見つけることができます。

4

1 に答える 1

3

イニシャライザの問題のようです。同時実行キューが完全に作成される前にスレッドが実行されます (競合)。おそらく、スレッドが機能するのstd::cerrに十分なだけスレッドを遅らせます。

2行を交換してみてください:

std::thread __workerThread;
mutable concurrent::queue<std::function<void()>, std::queue> __innerqueue;

スワッピングは__innerqueueスレッドの前に作成する必要があり、宣伝どおりに機能するはずです。

于 2013-02-20T13:33:36.587 に答える