Thread Synchronization
Unix環境でのAdvance Programmingという本 を読んでいます。
このセクションでは、動的に割り当てられたオブジェクトでミューテックスを使用する例を示します。私も同じように疑問を持っています。
ここで、私の疑問を説明するために起こっているイベントのタイムライン(上から下) を共有しています。
- スレッド 1 が作成されました。
- Thread1 はミューテックス変数を作成し、それを初期化し、グローバル リストに配置して、他のユーザーが使用できるようにします。
- ここで、Thread1 は共有データ構造を使用するためにロックを取得しました
ds
。スレッド 1 は で非常に大量の作業を行う必要がありますds
。つまり、スレッド 1 はこのロックを長時間取得します。 - Thread1 がまだロックを取得している間に、Thread2 が作成されます。
- 現在、Thread2 も ds を使用したいと考えています。
- そのため、Thread2 はまず、ds への参照が増加したことを示すカウンターをインクリメントする必要があります。これを行うには(本によると)
mutex_t
、カウントをインクリメントする前に 、まず同じ変数を使用してロックを取得する必要があります。 - ただし、Thread1 は既にこの
mutex_t
変数のロックを取得しているためlock()
、カウントをインクリメントする前に Thread2 を呼び出すと、Thread1 がロックを解除するまで待機する必要があります。
疑問:
- 彼が話しているグローバルリストについて(リストを作成し、その参照をすべてのスレッドまたは特定のリストに渡すことを意味します)?
- Thread1 がロック変数を作成すると、カウントが 1 に設定されます。その後、Thread2 は、このカウントを 2 にインクリメントするのを待っています。しかし、現在の作業を行った後、Thread1 が ds を使用する必要がなかった状況を想定します。
foo_rele()
したがって、ロックを解除する前にカウントを減らすか、最初にロックを解除してから再度ロックを呼び出してカウントを減らします。Thread2 がカウントをインクリメントする前に、Thread1 がカウントをデクリメントする可能性があります。はいの場合 (私によると)、私のデータ構造は破棄されますか? したがって、この本の例にはわずかな誤りがあると思います。別の mutex_var を使用してカウントをインクリメントした方がよいでしょうか?