問題タブ [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.

0 投票する
2 に答える
1424 参照

c++ - std::this_thread::yield が単なるヒントであることに問題はありますか?

同僚と私は、スピンロック ミューテックスをstd::atomic_flagで実装したいが、そのスピンロックを while(true) ではなく

基本的なアイデアは、スレッドがリアルタイムの優先度を持っていても、しばらくすると生成されるため、「非常に長い間」他のスレッドをブロックできないということです...しかし、 std::yield の仕様を見たとき、それは提案であり、強制的なものではありません。

スレッドの実行を再スケジュールするためのヒントを実装に提供し、他のスレッドを実行できるようにします。

http://en.cppreference.com/w/cpp/thread/yield

それで、それは問題になる可能性がありますか?

0 投票する
1 に答える
3370 参照

c++ - this_thread :: sleep_for(a while)を許可する方法は?

重複の可能性:
std :: this_thread :: sleep_for()およびGCC

プログラムをしばらくスリープ状態にして、簡単なタイマーとそれをテストするためのコードを書いてみました。

これにより、コンパイラエラーが発生します。

私はこれ<thread>までライブラリを使用したことがありません。簡単な修正を提案できますか?また、タイマーの正確さをテストするための代替手段にも満足しています。

0 投票する
1 に答える
521 参照

c++ - std::thread コンストラクターの可動パラメーター (Visual C++ 2012)

MSVC 2012 の右辺値参照で問題が発生しました。

コンパイラのメッセージ:エラー C2664: 'void (std::promise<_Ty> &&)' : パラメーター 1 を 'std::promise<_Ty>' から 'std::promise<_Ty> &&' に変換できません

私の間違い(それを修正する方法)またはコンパイラの問題(そのような動作の起源を知りたい)はありますか?

0 投票する
1 に答える
1008 参照

c++ - スレッド化 opencl コンパイル

[更新:] 現在、複数のプロセスを生成していますが、基本的なスレッド化の問題はまだ存在しますが、かなりうまく機能しています。[/]

一連の opencl カーネルをコンパイルする c++ (g++ 4.6.1) プログラムをスレッド化しようとしています。かかる時間のほとんどは、clBuildProgram 内で費やされます。(これは遺伝的プログラミングであり、実際にコードを実行して適合性を評価する方がはるかに高速です。) これらのカーネルのコンパイルをスレッド化しようとしていますが、今のところうまくいきません。この時点では、スレッド間で共有されるデータはありません (プラットフォームとデバイスの参照が同じであることを除けば) が、一度に 1 つのスレッドしか実行されません。このコードを複数のプロセス (Linux の異なるターミナル ウィンドウで起動するだけ) として実行すると、複数のコアが使用されますが、1 つのプロセス内では使用されません。基本的な計算だけで、同じ基本的なスレッド コード (std::thread) で複数のコアを使用できるので、これは、opencl コンパイルまたは忘れていた静的データのいずれかと関係があります。:) 何か案は?私はこれをスレッドセーフにするために最善を尽くしたので、困惑しています。

AMD の SDK (opencl 1.1、2010 年 6 月 13 日頃) と 5830 または 5850 を使用して実行しています。SDK と g++ は可能な限り最新ではありません。新しい g++ を入手するために新しい Linux ディストリビューションを最後にインストールしたとき、私のコードは半分の速度で実行されていたので (少なくとも opencl コンパイルはそうでした)、元に戻りました。(そのインストールのコードをチェックしたところ、スレッドの違いはなく、半分の速度で実行されます。)また、一度に1つのスレッドしか実行しないと言ったとき、それらすべてを起動し、終了するまで2つを交互に実行します。そして、コードがプログラムを構築するまで、すべてのスレッドが実行されているように見えます。clBuildProgram でコールバック関数を使用していません。ここでうまくいかないことがたくさんあり、コードなしで言うのは難しいと思います。:)

この問題は、clBuildProgram の内部または呼び出しで発生すると確信しています。ここにかかった時間を出力しています。延期されたスレッドは、最初のコンパイルで長いコンパイル時間で戻ってきます。これらの clBuildProgram 呼び出し間で共有される唯一のデータは、各スレッドの cl_device_id が同じ値を持つデバイス ID です。

これは私がスレッドを起動する方法です:

これは行き詰まりの場所です(デバイスIDは同じですが、これらはすべてローカル変数が渡されます):

各スレッドが一意のコンテキストを持っているか、command_queue を持っているかに違いはないようです。私はこれが問題だと本当に思っていたので、それについて言及しました。:)

更新: fork() を使用した子プロセスの生成は、これで機能します。

0 投票する
3 に答える
98 参照

c++ - 並列セクションで実行された場合、エラーをスローしますか?

私のコードには、静的ランダムエンジンジェネレーターで動作する関数があり、ユーザーがメインのスレッドとは異なるスレッドからこの関数を呼び出そうとすると、エラーをスローできるようにしたいと思います。

例として、次の関数を検討すると、次のようになります。

何でしょう/* SOMETHING */か?

0 投票する
1 に答える
123 参照

c++ - スレッドIDが-1になる原因は何ですか?

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

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

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

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

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

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

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

0 投票する
1 に答える
3064 参照

c++ - C++11 スレッド、メインスレッドで実行

C++11 スレッドを試す開発を行っています。非同期スレッドでいくつかのコードを実行したいのですが、そのコードが完了したら、メイン スレッドで他のコードを実行したいと考えています

これは、非同期で実行したいのは OpenGL のものをロードしているためであり、スレッドを実行するときに OpenGL コンテキストを使用するのは少し難しいためです。私が知る限り、異なるスレッドで同じコンテキストを実行しないでください。

ただし、collada ファイルをロードするローダー スレッドを作成したいと思います。ここで実際に時間のかかる作業は、ファイルを解析してデータをセットアップすることであり、(技術的に) 別のスレッドで実行できるすべてのことを行います。メイン スレッドでの opengl 固有のタスク。(これは私の最初の考えであり、間違った方法で進んでいる可能性があります)..

したがって、1 つのスレッド非同期をデタッチして collada ファイルをロードし、データを入力することができれば、それが完了したら、メイン スレッドで呼び出してバッファーをバインドし、シェーダーをセットアップするなどを行うことを考えています。私はスレッドなしでそれを行うことができますが、GL がおかしくなることなく、バックグラウンドで新しいデータをロードするのはかなりスムーズです..

そこで、やりたい手順を並べてみます。

  1. メインスレッドは、それが行うことを実行します...
  2. 誰かが新しいメッシュをロードするように要求します
  3. 非同期スレッドを作成し、その中に collada データをロードすることによって初期化されたメッシュ
  4. その間、メインスレッドはそれを実行し続けます
  5. collada の読み込みが完了すると、非同期スレッドは、メイン スレッドで追加の読み込み (つまり、セットアップ バッファーなど) を行うことをメイン スレッドに通知します。
  6. 設定が完了し、メッシュがレンダー キューに追加されます

私はそれをすべて同期的に動作させています。私が望むのは、切り離された非同期スレッドが終了したら、いくつかのことを行う方法です。

ここでの私の考えに対する任意のアイデアまたはもちろん建設的な批判:P は温かく歓迎されます! 私はそれについてすべて間違った方法で考えているかもしれません.オブザーバーパターンのようなことを考えていましたが、最善の方法でそれに取り組む方法が本当にわかりません. OpenGL のものをスレッド化してもかまいませんが、トラブルを求めているように思えます..

0 投票する
2 に答える
958 参照

c++ - クラスのメンバー関数の実行

以下の 20 行目の最初のコード スニペットに示すように、スレッド コンストラクターへのパラメーターとしてクラスのメンバー関数を受け入れる方法で C++11 スレッドを実験しようとしています。クラス定義は、2 番目のコード スニペットに示されています。このコードをコンパイルすると、3 番目のスニペットに示されている一連のエラーが表示されます。誰が私が間違っているのか教えてもらえますか? ありがとう。

スニペット 1: スレッドの初期化 (main_app.cpp)

スニペット 2: クラス定義

スニペット 3: コンパイル出力

0 投票する
1 に答える
315 参照

c++ - 補足: クラスのメンバー関数の実行

これは、クラスのメンバー関数の実行で以前投稿した問題のフォローアップです。

以下の 20 行目の最初のコード スニペットに示すように、スレッド コンストラクターへのパラメーターとしてクラスのメンバー関数を受け入れる方法で C++1.1 スレッドを実験しようとしています。クラス定義は、2 番目のコード スニペットに示されています。以前の関連投稿で与えられた回答に基づいて、コードは正常にコンパイルされます。ただし、最初のスニペットの 20 行目で実行時エラーが発生します。GDB バックトレースは 3 番目のスニペットに示されています。私は C++ を初めて使用するので、このエラーを正しく解釈できませんでした。何が問題なのか教えてください。ありがとう。

スニペット 1: スレッドの初期化 (main_app.cpp)

スニペット 2: クラス定義

スニペット 3: GDB バックトレース

0 投票する
2 に答える
4057 参照

c++ - clr と std::thread の使用

デスクトップ用の UI 抽象化レイヤーを作成しています。現在、.NET フレームワークの機能を実装しています。厄介なことに、ユーザーに Visual Studio で CLR Windows フォーム アプリケーションをstd::thread作成させると、標準ライブラリをすべて使用することができず、別の種類のアプリケーションを作成させると、コンソールが表示されます。

clrを使用する方法はありますstd::threadか、またはさらに良いことに、CLR コンソールまたは CLR 空のプロジェクトでコンソールが起動しないようにする (または画面とタスクバーの両方から非表示にする) 方法があります。

ありがとう