2012-02-21 12 views
0

挨拶!!私は、スレッド1ではPOSIXマルチスレッドアプリケーションでのLinuxで実行している交流AP、 をしました、私はこのようにグローバルなVARを設定ミューテックスを使わずにdouble varを保護する

スレッド2で
Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++) 
{ 
     Data1[idx].doubleval = idx * 100.0 * anothervar ; 
}//for 
Pthread_mutex_unlock(&Mutex1); 

、私はこのようにグローバルVARにそれを得ます:

Pthread_mutex_lock(&Mutex1); 
for(idx=0;idx<1000;idx++) 
{ 
    doublexxx = Data1[idx].doubleval ; 
    DoSomething(doublexxx) ; 
}//for 
Pthread_mutex_unlock(&Mutex1); 

さて、スレッド2がデータ1 [33] .doubleval、意志のData1 [33]を読んでいる間、スレッド1が.doublevalのData1 [33]を設定している場合、私は、私のAPにミューテックスを使用したくないと仮定します。 doublevalは非常に奇妙な値ですか?たとえば、double varには4バイトがあり、thread1はData1 [33] .doublevalの最初の2バイトを設定し、後で2バイトは終了しません。 thread2がData1 [33] .doublevalを読み込もうとしています... 。出来ますか ?

もしこのような問題がなければ、double varを保護するにはどうすればよいですか? ミューテックスは使い方が素晴らしいですが、ダブルバリューを保護するもう1つの方法があるのだろうかと疑問に思っています thread1がそれに書き込んでいます。少なくともスレッド2は同じvarから読み込もうとします

+1

ミューテックスを使用するだけで、あなたはそれについて心配する必要はありません。なぜあなたは不必要に問題を作り出すのですか?真に; –

+0

;ロックしたくない場合は、スレッドを使用すべきではありません。 – tbert

+0

おかげで、私のアプリケーションは多すぎるスレッドを使い、できるだけ早く実行したいと思いますが、mutex_lockのエフェクトのパフォーマンス、実際には小さなメモリのstrcpyブロックで使用されているすべてのミューテックスがどうなっているのか分かりませんが、それはより速く走る....すべての親切に返信いただきありがとうございます! – barfatchen

答えて

1

「部分的に書き込まれた」値を読み取ることができるかどうかは、ターゲットシステムやアラインメントなどの多数の要因によって決まります。たとえば、ソフトウェアでエミュレートされた浮動小数点サポートを備えた16ビットCPU上で動作するこのコードを想像してみてください。

mutexを使用しても、最初のスレッドが書き込みを行う前、または最初のスレッドが書き込みを行った後にデータを読み取ったかどうかがわからないため、2番目のスレッドの動作は未定義です。

あなたのデザインにはより高いレベルの問題があると思われます。おそらく、条件変数を使って、最初のスレッドが書き込まれるまで2番目のスレッドを待たせるべきです。

また、ミューテックスを削除する理由は、スケーラビリティとパフォーマンスを向上させるためです。たとえば、あるスレッドが配列の一部を使用し、別のスレッドが同じ配列の完全に異なる部分を変更するようにします。これがあなたの質問の背後にある理由なら、ソリューションはあなたのシナリオに依存します - 複数のロック(配列のエリアごとに1つのミューテックス、エントリごとに1つのミューテックスまで)を使用するのと同じくらい簡単かもしれませんが、/writer "ロック(他のスレッドが書き込まれていない限り、複数のスレッドがアレイから同時に読み取ることができるようになります)。

+0

ありがとうございました...スレッド1はエンドレスループでデータを書きますが、スレッド2は無限ループでデータを読み込みます。私の目標はスレッド2が奇妙な値を取得しないように、パフォーマンスを向上させることです。スレッド2はちょうど妥当な値を必要とするため、スレッド2はスレッド2でスレッド2で記述されているように不合理な値を読み込みます後の2バイトで、そのようなもの... – barfatchen

1

気になる問題は、書き込みの途中で値を読み取ることではありません。私はこれが可能なシステムを知らない。問題は、第2のスレッドの動作が未定義であることです。なぜなら、最初のスレッドが指定されたメモリセクションに書き込む前に読み込むのか後に読み込むのかわからないからです。ミューテックスや機能的に同等のものがなければ、明確な振る舞いを得る方法はありません。

+0

Wordの引き裂きは、Alphaプロセッサでは間違いなく起きる可能性があります。 x86 CPUでは、コンパイラが面白いことをしていないと仮定して、アラインされていないアクセスに対してのみ起こると思います。(例えば、GCCは、コードが値を変更しなくても、値を読み込んだ後にメモリに書き戻すことがあります)。 –

+0

スレッド2は常にグローバルdouble varスレッド1が常に書き込むg1、これらの2つのスレッドは両方とも無限ループになります.g1が1.55ならばthread1はg1 = 1.66を実行します。もしthread2がmutexなしで同じmonentでg1を読み出すなら、 g1は1.55または1.66でなければなりません。そうでなければ可能な値はありません。そして、私はmutexを避けるでしょう! – barfatchen

関連する問題