2011-06-21 9 views
3

これはmutexなしで実行されます。私はそれがスレッドセーフであるかどうか、つまりプログラムがクラッシュしないか、それと似ているかどうかを知りたいだけです。結果が致命的ではないため、変数を誤った状態にすることは本当に気にしません(必要でないときは小さなデータ構造のコピーを作成するだけです) 私はQtを使用しています。スレッドBから同じ変数を読み込みながら、スレッドAから変数を書き込むことはできます

ここでは、メインスレッドから、qthreadのメンバーであるブールを設定します。私がブール値をtrueに設定している間、またはその後に、このブールを使用する関数にqthreadが存在する可能性があります(これはメインスレッドとqthreadによって使用される関数で、すべてが既に保護されており、機能は両方のスレッドで同時に実行されています)

このブールはメインスレッドだけが使用するため、私はどのスレッドが機能しているかをチェックして解決するはずですが、私はまだ興味があります。

+0

ブールに基づいてスレッドを同期させる場合は、代わりに何らかの種類の待機イベントを使用する必要があります。 –

+0

@Tony、いいえ、いいえ、これはスレッドの同期には使用されません。 –

答えて

10

あなたは良性のレースと呼ばれるものについて尋ねているようです。

たとえば、0〜100の進捗値を表す整数変数を考えてみましょう。別のスレッドからインクリメントしているときに同時に1つのスレッドから読み込みます。書き込みの前に値を読み込むのか書き込み後に値を読み込むのかは気にしません。すぐにもう一度それを読んでから、あなたは書き込み後に価値を得るでしょう。 このシナリオではレースは良性です。しかし、良性でないかもしれないものは、引き裂きと呼ばれるものです。ハードウェアによって、メモリの一部だけが他のスレッドによって書き込まれている間に、値を読み取ることができます。

たとえば、書き込みスレッドは低ワードを書き込んだ後、両方のワードの読み出しが行われた後、上位ワードが書き込まれます。引き裂くと誤ってしまうことがあります。

ハードウェアは引き裂きを保証しますが、アーキテクチャによって異なります。例えば、x86は、4バイト整列された4バイト幅のデータについて、原子アクセス、すなわち引き裂きがない。

ポータブルコードを作成している場合、現在の標準ではアトミック性が保証されていないため、非常に扱いにくいものです。あなたのハードウェアプラットフォームを前提とすることができれば、良質のレースを利用できるかもしれません。

+0

okありがとうございました。問題の変数がポインタであった場合、どのようにして引き裂きがプログラムにとって致命的なものになるか理解しました。私の場合は、致命的な打ち切りを引き起こしてはならないブールです。いずれにしても、私はこれをやりなおすことはありません。 –

+1

良質なレースの潜在的な問題についての興味深い記事があります:[http://blog.corensic.com/2011/06/07/benign-data-races-considered-harmful/](http://blog。 corensic.com/2011/06/07/benign-data-races-considered-harmful/)。 –

2

ミューテックスなしで読むことはできますが、書き込みはできません。複数のスレッドが変数に書き込む場合は、それを保護するための何らかの同期メカニズムが必要です。

スレッドAが完了する前にスレッドBが読み込みを行った場合、単純な型ではなく一部の複雑な型であれば、矛盾した状態になる可能性があります。

+5

単純なタイプの場合でも矛盾が生じる可能性があります。 –

+0

@Oli、書き込みはアトミックであることが保証されていないためだと思いますか? –

+0

私は偽を取得する必要がありますが、むしろ私はアクセス違反やセグメンテーションの障害やクラッシュを望んでいないときに真実を取得する心配はありません –

1

プラットフォームは言及していませんが、Windowsの場合は、より簡単な型を扱う際には、::Interlocked...ファミリーのSDK関数を見てください。

+0

私は通常Linuxのディストリビューションですが、チップのおかげです。 –

関連する問題