2016-09-02 10 views
3

ポインタ(cv :: Matとbool's)でいくつかのスレッドにいくつかの変数を渡していて、ミューテックスを使用する。私は、cv :: Matのプログラムを使用せずに、私のプログラムがクラッシュする可能性があることを発見しました。(あるスレッドが他のスレッドが読み込んでいるメモリと同じ領域に書き込んでいる可能性が高いためです。問題を修正しました。なぜmutexはmutexを必要としないのですか?mutexにはmutexが必要です...

しかし今、mutexはもう1つの変数です。私は各スレッドにポインタを渡しています。この場合、mutex変数の扱いの使用は、mutexに必要な他の変数と同じです。mutexについて特別なことは、私もmutexは必要ないでしょう。永遠にそしてconeptは働かない)。

明確にするために、私のコードはうまくいきますが、これは教育目的のためのものです。

例:

//Common frames 
cv::Mat captureimage, displayimage; 
std::mutex capturemutex, displaymutex; 

//Start image capture thread 
std::thread t_imagecapture(CaptureImageThread, &captureimage, &capturemutex, &exitsignal); 
//Start image processor thread 
std::thread t_imageprocessor(ProcessImageThread, &captureimage, &capturemutex, &exitsignal); 
//Start display thread 
std::thread t_displayupdate(DisplayUpdateThread, &displayimage, &displaymutex, &exitsignal); 
+3

通常、スレッド間で共有されるすべての変数に対して1つのミューテックスを持つだけで十分です。 –

+1

ミューテックスはスレッドセーフであるように設計されています。これらは、オペレーティングシステムの基本的なメカニズムを使用します。これにより、mutexのロック/ロック解除時に競合条件が発生しないことが保証されます。 – Hayt

+3

"これらの変数にmutexを実装しました" - いいえ、あなたは** mutexを実装していません。あなたはミューテックスを**使用しました**。 –

答えて

4

ミューテックスはアトミックロックです。たとえば、低レベルのメソッド(CPU)を使用すると、中断されることなくロックがtest-and-setになる可能性があるため、これを実行するために外部ロックは必要ありません。ロックが設定されると、他のスレッドはそれを行うことができないため、mutexは他のリソースへのアクセスを保護することができます。

+0

これは1つの可能な実装です... –

+0

はい、私はすべての実装を指摘する必要があったと思う。私はすべての実装を知っていないので、強調するために編集します。 – stefaanv

+0

ありがとう!また、[this](http://preshing.com/20130618/atomic-vs-non-atomic-operations/)サイトは、アトミック操作の説明に役立ちました。そして、原子操作のトピックは、[これを読む](http://stackoverflow.com/questions/9200951/is-it-ok-to-read-a-shared-boolean-flag-without-locking-it-when- another-thread-ma)スレッドは、私のブール変数にstd :: atomicを使う必要があるように思えます。 – DrTarr

関連する問題