4

C で非常に単純なミューテックス (ロック) を実装しようとして、少し混乱しています。ミューテックスはバイナリ セマフォに似ていることを理解していますが、ミューテックスは、ロックを解放するスレッドが最近それを取得したのと同じスレッド。所有権を追跡する方法について混乱していますか?

これは私がこれまでに持っているものです。まだ完成しておらず、非常に単純であると想定されていることに注意してください(ユニプロセッサ、ミューテックスでの再帰なし、相互排除方式としての割り込みの無効化など)。

struct mutex {
    char *mutexName;
    volatile int inUse;
};

別のメンバー変数、つまりwhoIsOwnerを追加する必要があると思いますが、そこに何を格納するかについてはちょっと混乱しています。ロックを呼び出そうとしているスレッドを一意に識別できるものでなければならないと思いますか? これは正しいです?

「char *threadName」メンバー変数を持つスレッド構造を (他の変数と共に) 配置していますが、mutex 実装内からこれにアクセスする方法がわかりません。

ポインタ/ヒント/アイデアをいただければ幸いです。

4

2 に答える 2

4

ロック解除されたときのアトミック整数としてミューテックスを実装できます。これは0、ロックされていることを示すためにロックスレッドのIDの値を取ります。もちろん、変数へのアクセスはアトミックである必要があり、並べ替えを防ぐために適切にフェンスされている必要があります(取得と解放のフェンスのペアで十分です)。

もちろん、最終的には、自分が足を撃たれるのを防ぐことはできませ。本当に必要な場合は、ミューテックスのメモリを別のスレッドなどから強制的に上書きできます。ツールを正しく使用した場合にのみ、正しい動作が得られます。そのことを念頭に置いて、ロッキング変数の単純なブール値に満足するかもしれません。

于 2012-05-22T21:46:26.973 に答える
2
uint32_t  semOwner;

上記のフィールドが0の場合、それは使用可能です。「所有」されている場合は、所有タスクのID、スレッド、またはプロセスIDとスレッドIDの組み合わせ(またはシステムに適した他の組み合わせ)に設定します。

お役に立てれば。

于 2012-05-22T21:47:17.333 に答える