0

POSIXセマフォを使用して、キューを表すファイルからのアトミックなgetおよびputを管理したいと思います。完全に無関係なプロセスがキューを共有できるように、ファイルシステムに名前を付ける柔軟性が必要です。この計画ではpthreadが除外されていると思います。名前付きのposixセマフォは、すべてのプロセスが認識できるものをファイルシステムに配置するのに最適ですが、標準のCondWaitプリミティブが見つかりません。

... decide we have to wait ....
CondWait(sem, cond);

CondWaitがプロセスによって呼び出されると、アトミックにsemに投稿され、condを待機します。他のプロセスがcondにポストするとき、待機中のプロセスは、semもアトミックにデクリメントできる場合にのみウェイクアップします。の代替

... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

このプロセスが待機する直前に、他のプロセス信号が競合状態になるという競合状態が発生します。

並行プログラミングを行うことはほとんどないので、SOに尋ねると思いました。条件変数に標準のPOSIXカウントセマフォを使用する場合、このレースは良性である可能性がありますか?

誰かがより大きなコンテキストを必要とする場合に備えて、シェルスクリプトから呼び出すことができるアトミックキューのgetおよびput操作を構築しています。

4

4 に答える 4

2

他に答えがないので、私が学んだことをフォローアップします。

  • アトミック キューを共有する必要がある共通の祖先のないプロセスがあるため、Pthreads は私のアプリケーションでは機能しません。
  • Posix セマフォwakeup-waiting 競合の影響を受けますが、従来の条件変数とは異なり、セマフォをカウントしているため、競合は問題ありません。この主張を裏付ける証拠はありませんが、システムを 2 日間稼働させ、問題なく動作しています。(完全に無意味なことはわかっていますが、少なくとも仕事をやり遂げたことを意味します。)
  • 名前付き Posix セマフォは、ファイルシステムからガベージ コレクションするのが困難です。

要約すると、名前付き Posix セマフォは、関係のないプロセス間で共有されるアトミック キューの抽象化を実装するための優れた基盤であることが判明しました。

証明または検証済みの SPIN モデルが欲しいのですが、アプリケーションの必要性が限られているため、作成する可能性は低いと思われます。これが、Posix セマフォを使用したい人に役立つことを願っています。

于 2008-12-13T05:13:35.830 に答える
0

この質問が古いことは知っていますが、明らかな解決策は、プロセス共有ミューテックスとファイルにある条件変数を使用することmmapです.

于 2011-08-04T06:44:05.407 に答える
0

POSIX標準によると、セマフォ ルーチンのセットは次のとおりです。

  • sem_close()
  • sem_destroy()
  • sem_getvalue()
  • sem_init()
  • sem_open()
  • sem_post()
  • sem_timedwait()
  • sem_trywait()
  • sem_unlink()
  • sem_wait()

sem_trywait()and関数はsem_timedwait()、探しているものかもしれません。

于 2008-12-19T23:22:06.420 に答える
-1

あなたが探しているのは、pthread_cond_wait、pthread_cond_signal だと思います。
つまり、posix スレッドを使用している場合、pthread メソッドは CondWait と Signal の機能を提供します。
共有メモリを介したマルチプロセス pthread のソース コードについては、こちらを参照してください。
http://linux.die.net/man/3/pthread_mutexattr_init
これは Linux 用ですが、ドキュメントは posix です。これらは Solaris に似ていますが、OS のマニュアル ページを熟読することをお勧めします。

于 2008-12-10T07:48:27.217 に答える