2011-11-14 4 views
1

私はpthreadsでいくつかのことをやろうとしていて、それらを同期させようとしています:
どのようにしてスレッドのグループに対してmutexを使うことができますか?
私はをt0、t1、t2、.. t20としましょう。 pthreadsが同時に実行されていて、偶数のスレッドと奇数のスレッドのロックが必要です...または最初の10のロックと残りのロック、またはそれぞれのロック1。私は、そのデータに応じて、pthreadsをグループ化し、平均値(このfuncionで四番目の引数:pthreadのグループに対してmutexロックを共有する方法は?

int型のpthread_create(がpthread_t *スレッド、のpthread_attr_t * attrのボイド*(* start_routineが)(void *型)、void *型のarg);

とpthreadのグループのためのミューテックスを共有する。

私は銀行のプロジェクトの種類に働いていると私は同じアカウント番号にアクセスしようとするすべてのphreadsをロックする。(などクリティカルセクションCRUD操作)
センス?これを行うより良いアプローチがありますか?あなたの助けと時間を事前に
感謝;)

J.

+0

私は同様の問題ではなく、それが銀行口座に関連するのですが、あなたがチェックしたい場合があります場合は必ずラウンド私の頭を持ってます。http://stackoverflow.com/questions/18493241/pthread-mutex-per-thread -group/18494139 – wick

答えて

3

相互排他セマフォは、特定のスレッドに縛られることを意図していない、彼らは、特定のリソースを保護することを意図しています。

あなたの場合、そのリソースは銀行口座です。私は、あなたの銀行が何千万もの顧客を持っている場合、特にmutex-per-accountのソリューションが実用的なソリューションであると確信していません:-)

現在作業中のアカウントのリストをメモリに保存し、それを保護するために単一の utexを使用してください。操作は、ミューテックスをロックし、リストをチェックし、場合によっては変更し、ミューテックスをロック解除する。

あなたが探しているより良いアプローチは、ACIDタイプのバッキングストア(データベースなど)を使用して、すべての更新がアトミックであることを確認することです。

+0

+1は、ACID対応バッキングストアを提案します。アカウントのリストと1つのミューテックスは、追加作業なしではありません。あなたのアカウントがロック解除されるのを待っているのを避けるためには、条件変数を知る必要があります。 –

+0

こんにちは@paxdiablo、あなたの答えに感謝します。すべてのアカウントのリストが1つありますか? mutexはこのリストを保護し、処理を続行する前にそのリストをチェックする必要がありますが、同時に異なるアカウントでスレッドを動作させたい場合、これはアカウントのリストの1つですか? – jcosta

+0

@jcostaアカウントで作業している間にmutexをロックしないと、リストの作業中にロックされます。例:1つのスレッドがアカウント#7で作業したいそれはリストをロックし、他の誰もそれに取り組んでいないことを確認します。誰かがそうであれば、mutexとエラーのロックを解除します。そうでない場合は、そのアカウントの所有権を主張し(スレッドIDをスレッドIDに格納する)、mutexのロックを解除して作業を開始します。終了すると、ロックされ、所有権が削除され、ロックが解除されます。ミューテックスは、リスト自体の更新時にのみ保持されるため、異なるスレッドで異なるアカウントで動作することができます。 – paxdiablo

0

あなたは与えられたミューテックスを共有します。ミューテックスを偶数番号のスレッドで共有するだけの場合は、偶数番号のスレッドだけがそのミューテックスにアクセスするようにしてください。言い換えれば、ミューテックスを使用する正しい方法は、通常、特定のコードセットではなく、データのセットと関連付けることです。アカウント番号では、アカウントオブジェクトごとに1つのミューテックスを作成し、アカウントにアクセスするスレッドが最初に対応するミューテックスをロックするようにします(完了したらロックを解除します)。

+0

@cafに感謝しますが、銀行口座ごとに1つのミューテックスを実装する方法はありますか?つまり、mutexは変数です:pthread_mutex_tはスレッド間で共有されます。つまり、アカウントごとに1つの変数を追加することを意味しますか? (それはnoobの質問だ場合は、再度、申し訳ありません) – jcosta

+0

@jcosta:はい - あなたはすでに、単一の銀行口座を表し 'struct'を持っている場合たとえば、あなたがその' struct'に 'pthread_mutex_t'を追加することができます。あなたは 'struct'が最初に作成されたとき(それが他のスレッドに可視化される前に)' pthread_mutex_initの() 'でそれを初期化する必要がある、と(pthread_mutex_destroyの'でそれを破壊しよう) '' struct'が割り当て解除されているとき。 – caf

0

一般に、スレッドをロックしないでください。データ構造をロックします。そのデータ構造にアクセスするすべてのスレッドは、データ構造のミューテックスを取得する必要があります。

あなたの場合、これは銀行口座ごとに1つのミューテックスを意味します。

次の問題は、いくつかのものが複数のデータ構造にアクセスする必要があることです。たとえば、あるアカウントから別のアカウントに$ 100を移した場合(最初のアカウントの残高を減らして2番目のアカウントの残高を増やし、両方のロックを解除する場合)。これはデッドロックにつながります。たとえば、あるスレッドがAとBをロックしたい場合、別のスレッドがBとAをロックしたい場合、最初のスレッドはAをロックし、2番目のスレッドはBをロックし、どちらのスレッドも必要な2番目のロックを取得できません。

その問題を解決するには、グローバルな「ロック順序」を持っているだけという順序でロックを取得することです。あなたのケースでは

あなたが口座番号を持っています。スレッドが2つ以上のアカウントをロックしたい場合は、どのアカウントを決定し、次にアカウントのリストをソートし(例えば、最も低いアカウント番号から最も高いアカウント番号まで)、その順番で必要なすべてのロックを取得します。スレッドが必要とするすべてのロックを取得すると、スレッドは何をしていても、それを取得したすべてのロックを逆の順序で解放します。

+0

こんにちは@ブレンダン、ありがとう、はい、デッドロックを防ぐためにロックの順序を使用することについて正しいです。私はそうするでしょう。しかし、どのように銀行口座ごとに1つのミューテックスを実装しますかつまり、mutexは変数です: 'pthread_mutex_t'はスレッド間で共有されます。つまり、アカウントごとに1つの変数を追加するという意味ですか? (申し訳ありませんが、それはあなたの質問です) – jcosta

関連する問題