2016-11-17 8 views
0

私はLinuxのC++でプログラミングしていますが、私はpthreadsライブラリを使っています。私はいくつかの共有変数を保護するためにミューテックスを使用していますが、この特定のケースではミューテックスの使用が必要かどうかはわかりません。同時読み込みでmutexを使うかしないか

私は3つのスレッドを持っています。共有変数は文字列(グローバル変数)です。

スレッド1は値を変更し、その後スレッド2とスレッド3は値を読み取り、別の文字列に格納します。

この場合、文字列の値は1つのスレッドによってのみ変更されます。 2つのスレッドが同時に読める共有変数を保護するためにmutexを使用する必要はありますか?

+0

オブジェクトを変更するスレッドが少なくとも1つある場合は必ずmutexが必要です。あなたがそれを必要としないときの唯一の状況は、誰もが読んでいるだけなのです。 – Quentin

+0

しかし、スレッド2とスレッド3は、スレッド1が既にその値を変更したときにのみ、文字列の値を読み込みます。 –

+1

スレッド1が文字列の変更を完了する前に文字列の変更を完了することができれば、誰もが読むことができます:mutexは必要ありません。 – Quentin

答えて

1

shared_mutex(C++ 14/17を使用しない場合は、boostから取得してください)(C++ 14の場合は、使用できるshared_timed_mutexがあります)。文字列を読み取る場合はshared_lock、次に書きたい場合はunique_lockを入力します。

2つの共有ロックが合致する場合、それらは衝突せず、ブロックされませんが、共有ロックと一意のロックが衝突し、ロックの1つが終了するまでブロックされます。

+0

私はpthreadsライブラリを使用しています。私はそれを変更したくありません。それでも、あなたの答えをありがとう。 –

+0

@JulenUranga実際にあなたがpthreadsを使用しているかどうかは関係ありません。ロックは気にしない! –

+0

私は知っています!しかし、私は構造を維持し、スレッドと関連した同じ "関数"でプロジェクトを続行したいと思います。 –

0

pthreadを使用しているので、pthread_rwlock_tを使用できます。

オブジェクトを更新する場合、書き込みロックを取得するにはlocked using pthread_rwlock_wrlock()になります。すべての読者は共有読取りロックwith pthread_rwlock_rdlock()を取得した後にのみオブジェクトにアクセスします。書き込みロックは排他的で、読み取りロックは共有されているため、必要な動作を得ることができます。

pthread_rwlock_tの読み取り/書き込みロックの使用例は、http://www.ibm.com/support/knowledgecenter/ssw_aix_71/com.ibm.aix.genprogc/using_readwrite_locks.htmにあります。

pthread_rwlock_tロックで使用できるコールの概要は、https://docs.oracle.com/cd/E19455-01/806-5257/6je9h032u/index.htmlにあります。私は、操作の一覧表を再現しました:

Operation 

Initialize a read-write lock     "pthread_rwlock_init(3THR)" 

Read lock on read-write lock     "pthread_rwlock_rdlock(3THR)" 

Read lock with a nonblocking read-write lock "pthread_rwlock_tryrdlock(3THR)" 

Write lock on read-write lock     "pthread_rwlock_wrlock(3THR)" 

Write lock with a nonblocking read-write lock "pthread_rwlock_trywrlock(3THR)" 

Unlock a read-write lock      "pthread_rwlock_unlock(3THR)" 

Destroy a read-write lock      "pthread_rwlock_destroy(3THR)" 
1

「スレッド1が、それは価値とその後のです変更...」 - 「その後」他のスレッドがは、変更後を作成していることを意味している場合、必要はありませんミューテックスの場合。スレッドの作成はメモリを同期させます。それが何か他のものを意味するならば、ある種の同期が必要です。なぜなら、異なるスレッドの「後で」は同期なしで無意味であるからです。

+0

あなたが言ったように(別のスレッドの "後で"は同期なしで無意味です)、同期はmutexを使って行われました。それで、それらを守る必要はありません。ありがとうございました! –

+0

@JulenUranga - ミューテックスは何かが起こったことを**は保証しません。それができるのは、同時に起こらないようにすることです(大まかに言えば)。値が別のスレッドによって書き込まれた後にスレッドが値を読み込ませる必要がある場合、値がすでに書き込まれていることを伝える何らかの方法が必要です。 –

関連する問題