3

問題は、大学のプロジェクト用に「チャット シミュレーター」を作成していることです。あまり詳しく説明しませんが、クライアントは複数回実行でき、すべてのインスタンスはセマフォによって保護された共有メモリの同じセグメントを使用します (とりわけ)。

クライアントは未知の時間にシステムに出入りします。最初のクライアントがシステムに入ると、セマフォを作成し、共有メモリを使用して解放する必要があります。ただし、他のクライアントがシステムに入ると、共有メモリ アクセスを取得する前にセマフォで待機する必要があります。

今、明らかに何かが欠けているように感じます-セマフォを初期化するにはどうすればよいですか? を使用するsemget(42, 1, IPC_CREAT)と、結果のセマフォはほとんどの場合 0 になりますが、0 はプロセスがクリティカル セクションに既に存在することを意味する可能性があるため、セマフォを上げて初期化することはできません。つまり、デフォルト値 0 でセマフォを作成したばかりなのか、それともセマフォで待機しているプロセスがあるのか​​ わかりません。

擬似コード:

if(semaphore_not_exists(42))
{
    create_sem;
    raise_sem;
}
else
{
    get_sem_handle;
}
wait_on_sem;
critical_section;
release_sem;

では、セマフォがまだ別のプロセスによって作成されていないことを確認して、安全に初期化できるようにするにはどうすればよいでしょうか? を使用するIPC_EXCLと、リクエストは失敗しますが、次に何をすべきかわかりません。

4

2 に答える 2

0

セマフォのすべてのユーザーは、すでに初期化されているセマフォを取得する必要があると思います。そうしないと、セマフォ自体の初期化が競合状態の対象になります。システムのブートストラップでセマフォを初期化し、世話をするデーモンを持つことができます

create_sem;
raise_sem;

クライアントが実行する間

get_sem_handle;
于 2013-02-20T16:12:48.100 に答える