問題タブ [thread-safety]
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# - これは静的クラスとスレッド セーフの悪い習慣ですか?
lock ステートメントを使用していないと仮定すると、これは悪い習慣ですか?
編集 -
このようなことを試みた後、いくつかの理由でそれが実現不可能であることに気付きました。私はただ興味がありました..私が投稿した例は機能しません。
ruby-on-rails - Ruby/Railsスレッドセーフ
私は時々Rubyをハッキングしてきましたが、大きなことやマルチスレッド化したことは何もしていません。MRIはグリーンスレッドのみをサポートし、JRubyはJVMを介したネイティブスレッドをサポートしていると聞きました。しかし、ブログやディスカッショングループで、「Railsはスレッドセーフではない」またはRuby自体はスレッドセーフではないというコメントに出くわしました。たとえば、requireステートメントに問題があると誰かがコメントしました。それは少し基本的に聞こえます。
並行性を適切に処理しないJavaアプリをたくさん見ましたが、時々悪夢を見ました:-)しかし、少なくとも、自分が何をしているのかを本当に知っていれば、Javaでスレッドセーフなアプリケーションを作成できます(簡単ではありません)。
これはすべて非常に憂慮すべきことのように聞こえますが、誰かがもっと詳しく説明することはできますか?正確には何が問題であり、これが事実である場合、Railsはどのように機能するのでしょうか?競合状態やデッドロックなしで正しく機能するマルチスレッドRubyコードを記述できますか?JRubyとMRIの間で移植可能ですか、それともJVMネイティブスレッドを適切に利用するためにJVM固有のコードをハックする必要がありますか?
編集:
人々はレールスレッディングのもの(それ自体は素晴らしい)とグリーンスレッディング対ネイティブスレッディングにしか答えていないように見えるので、私は2つの質問をするべきでした。スレッドセーフに関するRubyのコア問題に関する私の懸念は、実際には対処されていません。場合によっては、requireに少なくとも(未解決の?)問題があるようです。
multithreading - マルチスレッドWindowshttpサーバーでスレッドセーフでないdllを実行する
VB6アプリケーションをIISによって呼び出されるCOMオブジェクトとしてカプセル化する必要があります。VB6アプリで使用されるdllの1つは、スレッドセーフではありません。
COMオブジェクトが呼び出されるたびに、それ自体の他のインスタンスと同じdllを共有しないようにするにはどうすればよいですか?
ActiveX exeが各インスタンスを異なるプロセスで実行することをどこかで読みましたが、それで十分でしょうか?
linux - Linuxでスレッドセーフタイマーを実装するには?
ご存知のように、シグナル ハンドラで何かを行うのは、割り込みのようなコンテキストで実行されるため、非常に悪いことです。シグナル ハンドラが呼び出されたときに、さまざまなロック (malloc() ヒープ ロックを含む!) が保持される可能性は十分にあります。
そのため、シグナルメカニズムを使用せずにスレッドセーフタイマーを実装したいと考えています。
どのようにできるのか?
申し訳ありませんが、実際には、スレッドセーフに関する回答は期待していませんが、スレッドセーフな Unix または Linux でのタイマーの実装に関する回答は期待していません。
java - EventActionDispatcher は、コンストラクターが終了する前に「これ」を発行できますか?
EventActionDispatcher の推奨される使用方法は次のとおりです (API ドキュメント @ http://struts.apache.org/1.2.9/api/org/apache/struts/actions/EventActionDispatcher.htmlによる) 。
これを行うと、コンストラクターが終了する前に「this」への参照が公開されますか? メソッド外のフィールド割り当てを管理する規則は何ですか。
前もって感謝します。
よろしくお願いします。
c# - .NET ref パラメーターはスレッドセーフですか、それとも安全でないマルチスレッド アクセスに対して脆弱ですか?
イントロの編集: C# の ref パラメーターは変数への参照を渡し、呼び出されたメソッド内で外部変数自体を変更できること
を知っています。しかし、参照は C ポインターのように処理されますか (そのパラメーターへのアクセスごとに元の変数の現在の内容を読み取り、パラメーターへの変更ごとに元の変数を変更します)、または呼び出されたメソッドは、通話時間は?前者は、いくつかのスレッド セーフの問題を引き起こします。特に:
オブジェクトを参照渡しする静的メソッドを C# で作成しました。
呼び出し元は、完成したがまだ登録されていないDefinition
オブジェクトを提供し、いくつかの一貫性チェックの後、提供された定義を「登録」します。ただし、同じキーを持つ定義が既に存在する場合、新しい定義を登録することはできず、代わりに参照がDefinition
そのキーの「公式」に更新されます。
これを厳密にスレッドセーフにしたいのですが、病的なシナリオが頭に浮かびます。クライアント (ライブラリを使用) が、ローカル変数ではなく静的メンバーを使用するなど、非スレッドセーフな方法で参照を共有するとします。
1 つのスレッドが を設定riskyReference = new Definition("key 1");
し、定義を記入し、Definition.Register(ref riskyReference);
別のスレッドも を設定することを決定している間に私たちを呼び出した場合、Register メソッドで、処理している参照が他のスレッドによって変更されないことがriskyReference = new Definition("key 2");
保証されます(newDefinition
オブジェクトがコピーインされ、戻ったときにコピーアウトされますか?)、または実行の途中で他のスレッドがオブジェクトを置き換えることができますか (元の格納場所へのポインターを参照している場合???)、したがって私たちの健全性チェックを壊しますか?
これは、基礎となるオブジェクト自体への変更とは異なることに注意してください。これはもちろん参照型 (クラス) に対して可能ですが、そのクラス内で適切にロックすることで簡単に防ぐことができます。ただし、外部クライアントの変数空間自体への変更を保護することはできません! メソッドの上部にあるパラメーターの独自のコピーを作成し、下部のパラメーターを上書きする必要があります (たとえば)。安全でない参照。
したがって、メソッドが元のオブジェクトへの一貫した参照を処理するように、コンパイラによって参照がコピーインおよびコピーアウトされる可能性があると考える傾向があります (必要に応じて独自の参照を変更するまで)。他のスレッドの元の場所で発生しています。しかし、ref パラメーターの文書化と議論において、その点に関する決定的な答えを見つけるのに苦労しています。
誰かが決定的な引用で私の懸念を和らげることができますか?
結論として編集:
マルチスレッドコードの例で確認し(Marcに感謝します!)、さらに考えてみると、実際に私が心配していた自動スレッドセーフではない動作であることは理にかなっています。「ref」の 1 つのポイントは、大きな構造体をコピーするのではなく、参照によって渡すことです。もう 1 つの理由は、変数の長期的な監視を設定し、変数への変更 (たとえば、null とライブ オブジェクトの間の変更) を確認するための参照を渡す必要がある場合です。イン/コピーアウトは許可されません。
したがって、Register
クライアントの狂気に対してメソッドを堅牢にするために、次のように実装できます。
最終的に得られるものに関しては、独自のスレッド化の問題がまだありますが、少なくとも彼らの狂気は、私たち自身の健全性チェックプロセスを壊すことはなく、おそらく私たちのチェックを通過して悪い状態になることはありません.
c# - .net フレームワークから取得し、オンラインで変更したコードを投稿することはできますか?
リフレクターを使用して汎用辞書コレクション (Dictionary<TKey, TValue>) のコードを表示し、そのコードを修正してスレッド セーフにしました。このコードを自分のブログに投稿して、他の人がレビューできるように (そして、私が何か間違ったことをしたかどうかを教えて)、必要に応じてプロジェクトで使用できるようにしたいと考えています。法的に言えば、私はそうすることが許されていますか? 元のコードを大幅に変更しました (元のコードからすべてではなくいくつかのメソッドのみを使用しました) が、基本コードは同じままです。
注: スレッド セーフな辞書の実装を教えてくれる人がいる場合に備えて、ReaderWriterLockSlim を使用したスレッド セーフな辞書の実装が既にあることは知っていますが、読み取り時 (書き込み時のみ) にロックは必要ありません。 3.5ではなく.net 2.0を使用しているため、とにかくReaderWriterLockSlimを使用できません。また、2.0のReaderWriterLockのパフォーマンスが非常に悪いことをどこかで読んだので、使用したくありません。
concurrency - 並行性の問題を検出するためのツール
プロジェクトに設計上の問題があるかどうかを教えてくれるツールを見ましたが、プロジェクトに並行性の問題があるかどうかを動的に教えてくれるツールがあるかどうか疑問に思っています。
c++ - ブーストされています shared_ptrスレッドセーフ?
について質問がありboost::shared_ptr<T>
ます。
スレッドがたくさんあります。
Q1
Thread_Aが最新であることを気にしない場合nowResource
、コードのこの部分に問題はありますか?
つまり、 Thread_BSetResource()
が完全ではない場合、 Thread_Aは間違ったスマート ポイントを取得しGetResource()
ます。
Q2
スレッドセーフとはどういう意味ですか?
リソースが最新かどうかを気にしないshared_ptr<CResource> nowResource
場合、 がリリースされたときにプログラムがクラッシュするか、それともnowResource
問題によって が破壊されshared_ptr<CResource>
ますか?