質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

1930閲覧

セマフォオブジェクトが取得・生成において「global\」または「local\」を付加する理由を教えてください

dem0nmichik0

総合スコア37

セマフォ

セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/06/30 01:39

実現しようとしていること

API関数の「OpenSemaphore」でセマフォオブジェクトに対するハンドルを取得後、「CreateSemaphore」でセマフォオブジェクトを生成しようとしています。

困っていること

「OpenSemaphore」でセマフォハンドルを取得後、「CreateSemaphore」でセマフォオブジェクトを生成しているのですが、複数のプロセスから生成したセマフォオブジェクトにアクセスすると、セマフォオブジェクトにアクセスできていなくて困っています。
社内の有識者に聞いたところ、「OpenSemaphore」のセマフォ名(lpName)の前に「global\」または「local\」のプレフィックスを付加してみて、と聞いたので実施したらアクセスできるようになりました。

どういうときに、「global\」または「local\」をつけるのでしょうか?ご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

そのセマフォオブジェクトに、セッションを超えてアクセスするかどうかで判断することになるかと思います。
あと、解説によると大文字小文字が区別されるようなので、正しくは Global\Local\みたいです。

以下に公式のオブジェクト名の解説があります。
Object Names
Kernel object namespaces

日本語はこちらです(機械翻訳なので、余計なところまで日本語になっていたりして読みにくいですが)。
オブジェクト名
カーネルオブジェクトの名前空間

投稿2021/07/01 12:33

編集2021/07/01 12:42
segavvy

総合スコア1038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dem0nmichik0

2021/07/07 12:30

segavvy様,回答ありがとうございます。 正しくは「Global\」と「Local\」なんですね。「global\」でセマフォオブジェクトが取得できているのはおかしいんですかね?調査してみます。 ありがとうございました。
segavvy

2021/07/07 12:50

「g」が小文字でも大丈夫かもしれませんが、お知らせしたマイクロソフトの説明では大小文字が区別されると書いてあるので、大文字小文字を正しく書いた方が安全だと思います。 また「\」はエスケープシーケンスを示すので、プログラムで書く場合は「\」と2つ書く形で正しいです。
dem0nmichik0

2021/07/07 13:38

>「g」が小文字でも大丈夫かもしれませんが、お知らせしたマイクロソフトの説明では大小文字が区別され>ると書いてあるので、大文字小文字を正しく書いた方が安全だと思います。 承知しました。 segavvy様のプロフィールを拝見して,メモリ管理のyoutubeとサイトを読んだうえで,もう一つ教えてください。セマフォオブジェクトのオープン(OpenSemaphore)を,自作クラス内のコンストラクタでコールするのと,自作サブルーチンでコールするのでは動きが違うのでしょうか?理由は,従来はサブルーチン内でOpenSemaphoreをコールしているときは,失敗することがありませんでした。ですが,今回,自作クラスのコンストラクタ内でOpenSemaphoreをコールして,そのクラスのインスタンスをnewで生成したら,失敗したという経緯です。もし,何かご存じでしたら,ご教授お願いします。
segavvy

2021/07/07 15:11 編集

YouTubeや記事をご覧いただき、ありがとうございます! クラスということはC++からのご利用でしょうか。 私はもうWindows APIやC++での開発をやらなくなって何年も過ぎていて、簡単に試せる環境もないのであまり自信がないですが、サブルーチン内なのかコンストラクタ内なのかで、OpenSemaphoreの挙動が変わることはないかと思います。 「サブルーチン内で実行」から「コンストラクタ内に実装&newで実行」に変えたことにより、何か他にも変わっている点はないでしょうか。例えばOpenSemaphoreを実行するスレッドが変わったり、開こうとしているセマフォオブジェクトの作成元のプロセスが異なったり、実行タイミングが異なったり、etc. また、OpenSemaphoreに失敗した際のエラー内容(=エラー直後のGetLastErrorの値)をご確認いただくと、そこにも何かヒントがあるかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問