問題タブ [reentrancy]
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.
c++ - C++ の新しい演算子は再入可能 (または非同期セーフ) ですか?
背景は私のこの質問にあります。簡単に言うと fork、マルチスレッド C++ プログラムで実行する必要があるため、再入可能な関数のみに制限されている場合にどれだけのことができるかを調べたいと思います。最も重要なことの 1 つは動的メモリです。
したがって、mallocは再入不可であることが知られています。しかし、C++ の場合はnewどうでしょうか? 関連する結果はあまりありませんでしたが(ほとんどの場合、正しい「新しい」をヒットするのが難しいためです)、 reentrantでnew あるクレームが少なくとも1つあります。C++ 標準ライブラリ全体に関する関連する質問もありますが、満足のいく答えはありません。
編集:標準はこれについて何も言っていないと思うので、私は主に主要な実装について心配しています。
asp.net - 独自の URL を再帰的に HTTP 要求する ASP.NET サイト
背景: ASP.NET MVC Web アプリケーションがあります。ユーザーに表示される HTML コンテンツを定期的にキャプチャし、どこかに保存して、時間の経過とともにコンテンツがどのように進化したかを追跡できるようにしたいと考えています。たとえば、1 年前に存在していたホームページの HTML をプルできるようにしたいと考えています。これは、URL のリストを定期的に実行するある種のクローラーを使用して実行できます。
私の質問: Web サイト自体HttpWebRequestが独自の URL に対して s を発行するのは良い考えですか? Timer1 時間に 1 つの URL をダウンロードして保存する Web アプリケーションを内部で起動できます。
別のアーキテクチャは、Windows サービスのような外部アプリケーションにクローラーを配置することです。ただし、これははるかに複雑なアーキテクチャになります。この質問では、より単純なアーキテクチャを回避しようとしているため、このオプションを検討したくありません。
ASP.NET アプリケーションが を使用して独自の URL を要求すると、何が問題になる可能性がありますHttpWebRequestか?
擬似コード:
どんな悪いことが起こるかわかりません。再入可能性の問題をスレッド化することを考えています。分散デッドロックなどには注意が必要です。
java - 複数の Java スレッドから再入不可のネイティブ共有ライブラリを呼び出す
JNAを使用して、もともとFortranで書かれたネイティブコードを呼び出すJavaコードがあります。(これは数値ライブラリであり、多くの数学者が Fortran でコーディングを行っています。) これは.soライブラリにコンパイルされます。以下を参照してください。
- Fortran: https://github.com/mizzao/libmao/tree/master/src/main/fortran
- Java バインディング: https://github.com/mizzao/libmao/blob/master/src/main/java/net/andrewmao/probability/MvnPackDirect.java
コードで単体テストを行ったすべてで素晴らしい結果が得られましたが、複数のスレッドからコードを使用しようとすると、すべてが奇妙なエラーで失敗し始めました。次に、再入可能な Fortran コードに関するいくつかのことを調べたところ、使用していたライブラリにいくつかのグローバル変数 (SAVE関数が再度呼び出されたときに変数の値を記憶する Fortran のキーワード: fortran SAVE ステートメント)と同等のものがあることがわかりました。
今のところ、ライブラリへの呼び出しをsynchronizedブロックでラップしていますが、これによりパフォーマンスが大幅に低下しています。ライブラリを再入可能に再設計するにはかなりの労力がかかるように思えます (数千行の数値コードがあり、サブルーチンが実行されているときに値がどのように引き継がれるかは明確ではありません)。問題を回避する最善の方法は?私の想像では…
- グローバル変数が事実上スレッドローカルになるように、各 Java スレッドが共有ライブラリの個別のコピーをメモリにロードするようにする方法はありますか? それは可能ですか?JNA のダイレクト バインディングまたはライブラリ バインディングがどのように機能するか、またそのように使用する方法があるかどうかはわかりません。
- 異なる VM から呼び出されたとしても、それはまだ台無しにされますか? 確認するにはどうすればよいですか?
gfortran( )を取得gccして Fortran コードを再入可能にコンパイルする方法はありますか?- Fortran コードを再入可能にする手っ取り早い方法はありますか? どうやら変数をスタックに保持しているキーワードについて検索しました
RECURSIVEが、既存のコードと互換性がないようです。 - 他に考えられる解決策はありますか?
複数の VM で問題がないことを確認しました。メモリを共有しないため、これは理にかなっています。それでもPITAであり、スレッドよりもはるかに不便です。
ios - GCD とコード再利用の使用: 再入可能なコードのデッドロックを回避する
クラスにスレッドセーフを追加するために GCD を使用しています。
クラスの一部のパブリック メソッドが、クラス内の他のパブリック メソッドによって呼び出されます。ただし、これは再入可能ロックの問題につながります。公開されている適切なメソッドを同期 GCD ブロック (場合によっては) で保護すると、再利用によって、現在のキューで別の同期ブロックを実行しようとすることがあります。 、デッドロックにつながります。
最もエレガントなソリューションは何ですか? 明白なアプローチは、適切なメソッドの内部バージョン (GCD ブロックなし) と、内部メソッドへの呼び出しをラップする GCD ブロックを持つメソッドの外部パブリック バージョンを用意することです。これは私にはあまり適切ではありません。
c - SSL_library_init が実用的な目的で再入可能ではないという意味は何ですか?
openssl ライブラリを使用して、一部のサーバーへの TLS 接続を開いています。ライブラリのドキュメントを読んでいます (はい、まだドキュメントやマニュアル ページを読んでいる人もいます) 。
一般的に、再入不可関数とは何かを理解しています。つまり、内部状態を保持する関数で、同時に2回呼び出したり、実行中に中断したりすると騒乱を引き起こす可能性があります(呼び出し元が期待していることを実行しない関数) .
しかし、SSL_library_init() の特定のケースでは、それが実際に何を意味するのだろうか。
SSL_library_init() の呼び出し中に何らかの割り込みが発生すると、SSL ライブラリが正しく初期化されないということですか? したがって、呼び出す前にアクセス可能なすべての割り込みを無効にし、必要な割り込みを後で再度有効にする必要がありますか?
それはスレッドセーフではないことを意味し、2 つのスレッドが同時に呼び出すことができないことを確認する必要がありますか? (スレッドセーフが再入可能と正確に同じではない場合でも、可能性が高いように見えます)。
プログラムの存続期間中に2回呼び出すべきではないということですか、それともSSL接続が開いている間に呼び出すと大混乱になるのでしょうか?
一方の端がクライアントで、もう一方の端がサーバーであるプロキシで作業しているため、両端が TLS サービスを使用している可能性があります (ただし、一方の端のみの場合もあれば、まったくない場合もあります)。SSL ライブラリをシステム全体のシングルトンとして管理する必要がありますか? この場合、管理は簡単ですが、私が理解しているように、再入の問題ではありません。
一度だけ呼び出されるべき関数の短い言葉がわかりません...
SSL_CTX_new() についても同様の質問があります。ドキュメントには、プログラムの存続期間ごとに 1 回だけ呼び出す必要があると記載されています。これは、サーバーとクライアント (または同じプロセスで実行されているいくつかの独立したサーバーまたはクライアント インスタンス) の両方が同じ SSL_METHOD を使用するように制限しているように見え、正しく感じられないため厄介ですが、この場合でも、ドキュメントの不正確さだけであることを願っています。 .
安全な側にとどまるためにOpenSSLの初期化コードで何をすべきか、何をすべきでないかを説明するのに十分なopenSSLの経験を持っている人はいますか?
java - Javaの「ReentrantLock」の意味は何ですか?
再入可能とは、呼び出しごとではなく、スレッドごとにロックが取得されることを意味します。
固有のロックはスレッドが保持しているので、一度実行されたスレッドは呼び出しベースに等しいということでしょうか?
ありがとう、それは次のことを意味しているようです: スレッドで、 functionを呼び出し、さらにロックが必要な関数をlockA処理するときにロックを取得すると、再入可能になります。Javaではこの現象はスレッド単位で取得されるので、デッドロックは考慮しなくてもいいのでしょうか?doAdoBdoBlockA
reentrancy - リエントラント機能とは?
SO とhttp://en.wikipedia.org/wiki/Reentrancy_(computing)のリエントラントに関するスレッドを 5 つ読みました。
再入可能関数のアイデアが得られるかもしれません。しかし、wiki サイトで例を読んだとき、私は本当に混乱しました。
最初の例:
サイトが説明したように: 「それでも再入可能には失敗します。これは、すでに swap() を実行しているスレッドと同じコンテキストで isr() が呼び出された場合、引き続き問題を引き起こします。」 => ここでどのような種類の問題が発生する可能性がありますか? ? スワップ結果が正しくない? それとも t 変数の値が変更されていますか?
そして、最初の例を改善した 2 番目の例:
これは最初のものをどのように改善しますか? これは、swap() 関数内で変数 t が変更されないということですか?
vba - MS Access 2010 で SetFocus を 2 回呼び出す必要がある
数時間、このコードが機能することがわかりました。
その後、不思議なことに機能しなくなりました。OnEnter サブルーチンの処理に何か関係があるのではないかと考えました (カーソルをテキスト フィールドの末尾に移動します)。
ただし、OnEnter サブルーチンを編集しても役に立ちませんでした。他に行ったことは、入力/キーボードの言語を変更することだけでした (引用符を入力して、すぐに表示できるようにするためです。ハザー!)。
私は今、このコードを持っています:
これは機能します。したがって、非表示、無効、非表示、牧師とのお茶などに関連する SetFocus が機能しないという 50 ページ以上の検索結果がここには当てはまらないことを私は知っています。
また、最初にフォーカスを別のコントロールに設定しようとしましたが、DoEvents も自由に適用しましたが、どちらも役に立ちませんでした。
誰かが似たようなことに遭遇したことがありますか、それともこれは本当に奇妙なハイゼンバグですか?
c - シグナルハンドラ内の書式付き I/O
メッセージをファイル (FILE *) に書き込む SIGSEGV ハンドラを作成したいと考えています。fprintf は再入可能ではなく、シグナル ハンドラ内で呼び出すべきではないと聞いたことがあります。それの再入可能バージョン、またはシグナルハンドラー内で呼び出すことができるフォーマットされたファイル I/O を提供する他の関数はありますか?
c++ - main() 関数は再入可能ですか?
C では main() は再入可能ですが、C++ ではそうではないと聞きました。
これは本当ですか?main() 関数を再入力するシナリオは何ですか?