0

言語は C で、アプリには複数のスレッドがあります。値を変更できる int 配列があり、その値を読み書きするミューテックスがあります。しかし、配列のベースアドレス (&arr[0] など) は決して変更されないため、この値 (配列のベースアドレス) を読み取るためにミューテックスが必要ですか?

メインスレッドで私が持っている

int arr[10];

私が持っている別のスレッドで

int *ptr = &arr[0]; // this line
pthread_mutex_lock(&mutex);
*ptr = 2;
pthread_mutex_unlock(&mutex);
ptr++;  // and this line

これを行うにはミューテックスが必要ですか?

4

2 に答える 2

1

問題は、*ptr がミューテックスによって保護されているかどうかです。コードとして、ミューテックスはメモリ操作とは関係ありません。他のスレッドはミューテックスをロックしてから書き込みを行います。このスレッドと同じように、別のスレッドがメモリに書き込みたい場合でも、それは機能します。ミューテックスチェックを使用して、メモリ操作の機能を実行してください。ミューテックスは妥当です。それ以外の場合は、これを削除するだけです。

于 2013-05-03T12:30:40.523 に答える
0

ミューテックスを使用しても害はありません。スレッドが開始されると、それが指す と データの両方がptr変更されない場合 (つまり、スレッドを開始する前に と データを内部にmain設定するだけで、スレッドがポインター先のメモリ ゾーンに書き込むことはありません)、ミューテックスを使用することを避けることができます。 .ptrptr

スレッドの 1 つがポインターを書き込んでいる (またはポイント先のデータに) 他のスレッドがそれを読み取っている場合、mutex でアクセスをシリアル化する必要があります (mutex なしでハードウェアで動作する可能性がある場合でも)。

優れたPthread チュートリアルを読む必要があります。

pthread_rwlock_rdlockおよびその仲間で読み取り/書き込みロックを使用することを検討してください(多くの場合、ミューテックスよりも高価です)。

于 2013-05-03T12:23:56.000 に答える