問題タブ [semaphore]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
1670 参照

.net - .NET コンパクト フレームワークのセマフォ

残念ながら、.NET Compact Framework を使用する場合、System.Threading にはセマフォがありません。なぜだかわかりませんが、誰か考えがありますか?

グーグルで調べた後、独自の実装を提供している人をたくさん見つけましたが、実際にうまく機能した人はいません...またはまったく機能しませんでした!

そこで専門家に聞いてみた...

.NET コンパクト フレームワークに推奨できる優れたセマフォ クラス/ライブラリを持っている人はいますか?

また

動作をエミュレートできる方法はありますか?

スレッドがオブジェクトをキュー (System.Collections) にプッシュする典型的なプロデューサー/コンシューマーのセットアップがあります。次に、コンシューマ スレッドがオブジェクトをキューから取り出して作業を行うようにしたいと考えていますが、明らかにキューに処理するものがある場合に限られます!

私は C# で作業していますが、.NET CF に実装できる限り、任意の言語でソリューション/疑似を使用します。

0 投票する
2 に答える
2889 参照

c++ - Linux プロセス間再入可能セマフォ

Windows アプリケーションを Linux に移植していますが、同期の問題があります。

Windows では、共有メモリ ブロックへのアクセスを同期するために、システム レベルの名前付きミューテックスを使用しています。

Linuxでそれをエミュレートするにはどうすればよいですか? semget を使用して SystemV セマフォを作成しました。問題は、再入可能ではないことです。既に保持している場合、Windows とは異なり、ブロックされます。これに参照カウントを追加することもできますが、その場合はアクセスを同期する必要があります。つまり、別の (今回は現在のプロセスのみの) ミューテックスを意味します。

再入可能なプロセス間ロックを提供するクラスはどこかにありますか (おそらく Boost で)?

ところで、ファイル ロックの使用はおそらく遅すぎるため、受け入れられません (2 つのプロセス間の超低遅延通信が必要です)。

0 投票する
3 に答える
1756 参照

c++ - スレッドまたはプロセスの同期のためのfcntl()?

(セマフォレスの代わりに)スレッド/プロセスの同期を実現するためにファイルでfcntl()システムコールを使用することは可能ですか?

0 投票する
2 に答える
3616 参照

c - sem_timedwait は RedHat Enterprise Linux 5.3 以降では適切にサポートされていませんか?

pthreads sem_timedwait を使用する RedHat Enterprise Linux システムで奇妙な動作が見られます。バージョン 5.3 以降でのみ発生します。

sem_init を使用してバックグラウンド スレッドでセマフォを作成すると、エラーは返されません。sem_timedwait を実行すると、サポートされていないことを示す errno = 38 (ENOSYS) がすぐに返されます。

メイン スレッドで同じことを行うと、期待どおりに動作し、sem_timedwait からエラーは発生しません。

RHEL 5.2 以前では見られません。コードを gcc 3.2.3 および 4.1.2 でコンパイルしようとしましたが、同じ結果が得られたので、実行時の問題のようです。

それで、私の質問(最後に;)

1) 他の誰かがこれを見たことがありますか? 2) RHEL 5.3 以降の既知の問題ですか? 3) sem_timedwait を使用して単一のスレッドをスリープさせています。Linux で同じことを行うには、どのような代替手段がありますか?

これが別の質問と重複している場合は、お知らせください。私は見ましたが、同じ質問を持つものを見つけることができません。私たちが使用しているものではないOSXの同様のものです。

ありがとう、pxb

更新:次の結果でさらにテストを行いました:

  • RHEL5.4 ボックス (-L/usr/lib64 および -lstdc++ -lrt を使用) で gcc 4.1.2 を使用して 64 ビット ビルドを実行し、RHEL5 の 64 ビット インストールで実行すると、正常に動作します。
  • RHEL5.1 ボックス (-L/usr/lib および -lstdc++ -lrt を使用) で gcc 4.1.2 を使用して 32 ビット ビルドを実行し、まったく同じ 64 ビット RHEL5 ボックスで実行すると、ENOSYS エラーが発生します。 sem_timedwait

したがって、RHEL5.4 (および一見 RHEL5.3) の 64 ビットと 32 ビットのランタイム ライブラリの違いのようです。その他の唯一の違いは、32 ビットと 64 ビットのビルドがそれぞれ RHEL5.1 ボックスと RHEL5.4 ボックスで行われたことです。

0 投票する
2 に答える
527 参照

compact-framework - XBox 360 で XNA に適したセマフォはありますか?

.NET Compact Framework 用のセマフォの高速で効率的な実装を探しています。P/Invoke の使用が提案されている SO ( .NET コンパクト フレームワークのセマフォ) に関する別の質問がありましたが、これは XBox 360 で実行されている XNA Framework では不可能です。

独自の実装を 2 つ提供できますが、どちらも最適ではないと思います。

AutoResetEvent を使用するセマフォ(pastebin)
マネージド セマフォの可能な実装の 1 つは、AutoResetEvent を使用することです。

この場合、作業が利用可能になると、AutoResetEvent は 1 つのスレッドのみを「実行可能」状態に遷移させます。OS スレッド スケジューラがスレッドを実行すると、AutoResetEvent が再度開かれ、次のスレッドが「実行可能」状態になります。そのため、スレッドは順番に開始され、先行スレッドが実際に実行された後にのみ開始されます。

ManualResetEvent を使用するセマフォ(pastebin)
もう 1 つの可能な実装は、ManualResetEvent を使用することです。

この場合、作業が利用可能になると、ManualResetEvent はすべてのスレッドを「実行可能」状態に遷移させます。OS スレッド スケジューラが実行するすべてのスレッドは、作業を使い果たした最初のスレッドが ManualResetEvent を再びリセットするまで、作業項目を求めて競合します。つまり、すべてのスレッドが必要でない場合でも、すべてのスレッドが短時間だけ起こされる可能性があります。

誰かがより良い実装を知っているか、私のものを改善するための提案を提供できますか?

0 投票する
9 に答える
4364 参照

c++ - スレッドと単純なデッドロックの解決

ミューテックス ロックとセマフォを使用して (特に C++ で) スレッドを処理する場合、デッド ロックを回避し、クリーンな同期を行うための簡単な経験則はありますか?

0 投票する
2 に答える
1682 参照

php - ブロックせずに PHP セマフォをクエリしますか?

sem_acquire 関数のように実際にブロックせずに、sem_get で作成されたセマフォを照会することは可能ですか?

乾杯、ダン。

0 投票する
2 に答える
329 参照

concurrency - セマフォは「完全」ですか?

セマフォを適切に使用することで、考えられるすべての同期の問題を解決できますか?弱いセマフォはどうですか?