問題タブ [stdthread]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::threadsのベクトル
C ++ 11
私はsを作ろうとしていvector
ますstd::thread
。次の3つのポイントの組み合わせは私ができると言います。
1.) http://en.cppreference.com/w/cpp/thread/thread/threadによると、
thread
のデフォルトコンストラクタは
スレッドを表さないスレッドオブジェクト。
2.) http://en.cppreference.com/w/cpp/thread/thread/operator%3Dによるthread
と、operator=
移動セマンティクスを使用して、[スレッドの右辺値参照であるパラメーター]の状態を[呼び出し元のスレッド]に割り当てます。
3.) http://en.cppreference.com/w/cpp/container/vector/vectorによると 、サイズ型変数のみをベクトルコンストラクターに渡すと次のようになります。
[指定された数]の値が初期化された(クラスの場合はデフォルトで構築された)インスタンスを持つコンテナー。コピーは作成されません。
だから、私はこれをしました:
これは、以下に示すように、VC11およびg ++ 4.8.0(ここではオンラインコンパイラ)で期待どおりに実行されます。
コンソール出力:
次に、同じWebページでコンパイラメニューを切り替えて、clang3.2で試してみました。
スレッドを表すスレッドオブジェクトがjoin()
edまたはdetach()
edされる前にスコープ外になると、プログラムは強制的に終了します。私はjoin()
編集vecThread.at(0)
したので、問題になっているのは一時的なスレッドだけです
std::thread(foo);
の中に
vecThread.at(0) = std::thread(foo);
割り当て。
ただし、Web参照によると、スレッドはスレッド右辺値参照を移動することによってのみ割り当てることができます。join()
一時的detach()
なスレッドオブジェクトへの道は考えられません。
それで、clangの出力が正しい場合、thread
'sの使用は何operator=
ですか?それとも、これはclangコンパイラのバグですか?
g ++ 4.8.0では、行を変更します
vecThread.at(0) = std::thread(foo)
に
vecThread.at(0) = std::thread{foo}
(括弧を中括弧に置き換えても)期待されるHello
出力が得られます。
ただし、行を変更しvecThread.at(0) = {foo}
て文句を言うようにします。
中括弧に関するg++4.8.0の苦情:
エラー:初期化子リストから'std :: thread'に変換すると、明示的なコンストラクター' std :: thread :: thread(_Callable &&、_Args && ...)[with _Callable = void(&)(); _Args = {}]'vecThread.at(0)= {foo};
これはあまりにも進んでいます—それが何を意味するのかわかりません。
clangで同じ変更を加えると、さらに高度になります。
中括弧に関するclang3.2の苦情:
それが何を意味するのかもわかりません。
上記を裏付けるためにVC11を使用することはできません
vecThread.at(0) = {foo}
2012年11月のCTPコンパイラの時点でVC11は、標準ライブラリで統一された初期化構文をサポートしていないため、問題が発生します。
c++ - MinGW と std::thread
そのため、MinGW コンパイラを使用して、次のコードをコンパイルして Windows で実行しようとしました。
次のコマンドでコンパイルしています。
ここでの問題は、使用する必要がある MinGW のバージョンであり、私が知っているすべてのバージョンについて試しました。
- MinGW ビルド: thread-win32
- MinGW ビルド:スレッド posix
- MinGW-w64: stdthread の実験的な rubenvb
- MinGW-w64: stdthread 実験的 rubenvb 4.7
番号 1 は機能しません。GCC は明らかに内部的に pthread のものしかサポートしていないからです。
番号 2 はコンパイルされ、基本的に出力も行われますtest
が (出力の最後の行を参照)、次のエラーでクラッシュします。
番号 3 と 4 もコンパイルされますが、出力されずtest
、代わりに即座にクラッシュしますが、より説明的な出力が得られます。
もちろん、GoogleはGCCバグトラッカーと他のいくつかの投稿に私を連れてきて、使用を提案しましたが-pthread
、まったく役に立ちません。
winpthread
とに対して手動でリンクしようとしましpthread
たが、それも何もしません。
との間にも違いはありませ-std=c++11
ん-std=gnu++11
...
をサポートする MinGW バージョンを入手できるかどうかはわかりませんが、std::thread
コンパイラ フラグを見落としているだけかもしれません。誰かが私を助けてくれることを願っています!
c++ - SDL_Flipデッドロック
私のアプリケーションには、アプリケーションを実行する単純な Execute メソッドがあります。これは非常に単純化されており、次のようになります。
Render() は次のようになりますが、これも単純化されています。
デバッガがアタッチされている場合、これは正常に機能しますが、実行可能ファイルを実行すると、アプリケーションがフリーズし、gdb がプロセスにアタッチされます。メイン スレッドが SDL_Flip() 内でスタックしていることがわかります。
ソケットを使用してクライアントをリッスンする別のスレッドを起動することで、この問題を絞り込むことができました。この 2 番目のスレッドの開始をコメントアウトすると、すべてのモードで動作するようになります。
スレッドは、クラス「サーバー」内で次のように開始されます。
ListenThread は通常のソケット設定 getaddrinfo()、socket()、bind()、listen() を行い、最後にブロッキング関数 accept() の呼び出しを行います。
繰り返しますが、このサーバー、およびレンダリングとすべては、デバッガーが接続されている場合に完全に機能します。ハングするのは「直接」起動された場合のみです (停止するにはプロセスを強制的に強制終了します)。
サーバーとアプリには共通のデータ構造がありません。サーバーはアプリについて何も知りません。2 つの間の唯一の関係は、アプリがサーバーにコールバック関数を設定することです。
編集(追加):これは私のPCでのみ発生し、ラップトップでまったく同じセットアップ(ubuntu、gcc、sdlバージョンなど)を使用しており、ラップトップで正常に動作します。それが関連しているかどうか/どのように関連しているかを確認してください。ただし、Windows 8のHyper-V仮想マシン内でUbuntuを実行しています。
c++ - std::thread はどのくらい標準ですか?
cplusplus.comやJosuttis Standard Library Reference bookなど、C++11 用に更新された多くの古典的な C++ 参照ソースでは、ドキュメントがまったくカバーされていないように見えることに気付きました。 std::thread
、std::atomic
、などの C++11 同時実行標準ライブラリ機能std::async
。
これらの同時実行機能は、標準ライブラリの残りの部分よりも「標準的ではない」のですか? それとも、他の理由でドキュメントが不足しているだけですか?
c++ - C++11 'native_handle' は 'std::this_thread' のメンバーではありません
次のコード スニペットでは、
関数内native_handle
からfromを取得するにはどうすればよいですか?std::this_thread
foo
android - Android NDK の std::thread が誤ってスタックする
私たちは、ネットワークとビデオ画像処理をネイティブで (主に c++11 を使用して記述)、Java で開発者インターフェイスを備えた Java/ネイティブ ライブラリを構築しています。
問題は、jni 呼び出し中に全体が非常に頻繁にスタックすることです。最新の ndk-r8e を使用し、std::thread を使用して作成された複数のスレッドをネイティブで実行しています。
どんなアイデアでも大歓迎です。
lambda - スレッドラムダ関数はコンパイルされません
なぜこれが起こるのか理解に苦しんでいます。おそらくバグです。
コメントの仕方を変更した場合にのみコンパイルされるのはなぜですか?
winpthreads で gcc 4.8.0 を使用しています。