none
CriticalSection RRS feed

  • 質問

  • ハード(拡張基板)にアクセスするDLLをマルチプロセス対応にしたいと思っています。

    MutexはCriticalSectionより桁違いに遅いと聞いているのですが、CriticalSectionを

    DLLでshareしてプロセス間排他を行なうことは可能でしょうか?

    2007年4月5日 11:26

すべての返信

  • できません。

    プロセス間での排他制御を行いたい場合は、名前付きの Mutex などを利用してください。単純な排他制御ならEventが比較的軽いですよ。

    2007年4月5日 11:52
  • ご回答ありがとうございます。

    初心者な質問で申し訳ありません。なんでできないのでしょうか?

    またMeteredSectionというのは使えますか?

    2007年4月5日 12:16
  • 元々プロセス間を越えて使えるようにデザインされていないからです…としかいいようが

    MeteredSectionに関しては、私は使ったことありませんが、既存のAPIの組み合わせで作っているものですね。試さないといけないでしょうけれど、使えるとは思いますよ。

    2007年4月5日 14:28
  • すでに、KKamegawa さんがこたえてますが、プロセス間通信で同じものを利用する場合、それが同じであることを確保する為に、「名前付きの」オブジェクトを利用する必要があります。

     

    ですが、CriticalSection には名前をつけることができませんので、その時点でプロセスをまたいだ同期はできないということになります。

    もっとも、ほかの同期オブジェクトとは異なり、CriticalSection は初めて作られたその時からプロセス内のスレッド間の同期のためにつくられていますので、元々の設計思想そのものから、プロセスをまたいでの利用は不可能になってるんですけどね。

     

    で、MeteredSection ってなに?と思ったんですが、APIではなくて、ユーザーコードみたいですね。なので、ソース見てくださいとしか言いようがありません(このコメントではじめてその存在を知りましたしw)。

     

    ちなみに、最初の時点で Mutex だったのであえてほかのものはあげてませんが、Event の方が多分軽量です<同期処理

     

    いずれにしてもプロセス間通信(それが排他制御であろうが、同期化であろうが)は、お互いに見えない壁の向こうとのやりとりになります。

    なので、どういう手段をとる場合でも、間接的な処理になるということを念頭において、設計していく必要があります。

     

    2007年4月6日 2:59
  • KKamegawaさま、とっちゃんさま

    回答ありがとうございます。

    普通に使えばプロセス間での利用は無理でしょうが、最初に挙げたようにDLLで共有すればと思ったのですが

    プロセスに関連付けられてしまっている部分があるということでしょうか

    2007年4月6日 4:10
  •  初心者 さんからの引用

    KKamegawaさま、とっちゃんさま

    回答ありがとうございます。

    普通に使えばプロセス間での利用は無理でしょうが、最初に挙げたようにDLLで共有すればと思ったのですが

    プロセスに関連付けられてしまっている部分があるということでしょうか

     

    DLLにしてもプロセス毎のメモリ空間にロードされるはずですから無理な気がしますけれど

    具体的にどうすれば出来そうと言う考えがあるのであれば、きちんと提示した方が話が早いし

    レスポンスも付きやすいと思います。

    もし、共有データセグメントで解決しようしているのであれば、多分駄目でしょう。

    MSDNに以下のような文章がありますから

     

    プロセス固有の情報は、共有データ セグメントに格納しないでください。ハンドルなどの Win32 のほとんどのデータ構造体やデータ値は、実際には単一プロセスのコンテキスト内だけで有効です。

    2007年4月6日 6:29
  • 返答ダブっちゃいますがw

     

    DLLだろうが、ドライバだろうが「CriticalSection」をプロセス間で共有することはできません。

    CriticalSection オブジェクトはプロセス内(より正確には同じメモリ空間内)のスレッド間での排他制御専用に作られた特殊なオブジェクトですので、それを超えるような運用が行えるようにはなっていません。

    なので、同一スレッド上での排他制御も出来ません(以外と気づかずはまる場合がありますのでw)。

     

    仕組みを単純にすることで、高速化を実現させているということもありますけど、仕組みを単純にしている分、運用に制限をかけているとも言えます。

     

    仮に、ハードウェアにアクセスする部分をドライバで実現していたとしても、そこで CriticalSection を使うというのは恐らくできないとおもいます。

    ドライバ周りは詳しくないのでわかりませんが、それだけCriticalSectionが特別な作りをしているという事でもあるのですがねw

    2007年4月6日 9:39
  • 回答ありがとうございます。

    #pragma data_seg(".shared")でできるんじゃないかと思ってしまいました。

    やっぱりそんなに上手い話はないですね。

    Mutexやイベントが遅いと言っても、考えてみるとドライバのアクセスが

    1回(10us程度)増えたと思えばいいかという気になってきました。

      ありがとうございました
    2007年4月6日 10:04