問題タブ [synchronization]
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.
svn - SourceSafe を SVN と同期する
当社には、ソース コードを SourceSafe リポジトリに保持するという要件を課すポリシーがあります。私は経営陣を説得して SVN に移行するよう説得しましたが、成功しませんでした (これは別の問題です)。
私と同僚の何人かは、自分のコンピューターに (Apache 経由で) 配置された SVN リポジトリを使用しているため、会社のサーバーにリポジトリをバックアップする PowerShell スクリプトを作成しました (これも定期的にバックアップされます)。これはうまく機能しますが、SourceSafe サーバーにソース コードのコピーを保持したいとします。
それを行うための経験やヒントはありますか?
ありがとう
c# - C# でのロック
私はまだ少し不明確で、コードをいつロックするかはわかりません。私の一般的な経験則は、静的変数の読み取りまたは書き込み時に操作をロックでラップすることです。しかし、静的変数が読み取り専用の場合 (たとえば、型の初期化中に設定された読み取り専用の場合)、それにアクセスするために lock ステートメントでラップする必要はありませんよね? 最近、次の例のようなコードをいくつか見たので、マルチスレッドに関する知識にギャップがあるのではないかと思いました。
それは私には意味がありません.なぜレジスタの読み取りに並行性の問題があるのでしょうか?
また、この例は別の問題を提起します。これらのうちの1つは他のものより優れていますか? (たとえば、例 2 では、ロックを保持する時間が短くなりますか?) MSIL を逆アセンブルできると思います...
対。
.net - .NET に一般的な同期キューがないのはなぜですか?
Queue.Synchronize を呼び出してスレッド セーフなキュー オブジェクトを取得できることに気付きましたが、Queue<T> では同じメソッドを使用できません。誰かが理由を知っていますか?ちょっと奇妙に思えます。
synchronization - 特別なハードウェア命令を使わずに、1 つのコードでどのように動作をテストして設定するのでしょうか?
私が見つけたほとんどの実装では、これを行うためにハードウェア命令が必要です。ただし、これが必要であることを強く疑っています(そうである場合、理由がわかりません...)
c++ - C++ スレッド、共有データ
2 つのスレッドが実行されているアプリケーションがあります...一方のスレッドからグローバル変数を変更すると、もう一方のスレッドがこの変更に気付くという保証はありますか? 同期または相互排除システムを導入していません...しかし、このコードは常に機能するはずです(dataUpdatedという名前のグローバルブールを想像してください):
スレッド 1:
スレッド 2:
gcc のようなコンパイラは、コンパイル時の値のみを考慮して、グローバル値をチェックしない方法でこのコードを最適化しますか (同じスレッドで変更されることはないため)。
PS: これはゲームのようなアプリケーションのためのものなので、値が書き込まれている間に読み取りが行われるかどうかは実際には問題ではありません...重要なのは、変更が他のスレッドによって通知されることだけです。
synchronization - テストアンドセットは何に使用されますか?
テストアンドセットのウィキペディアのエントリを読んだ後も、「テストアンドセットは何に使用されるのか」という質問が残ります。
(ウィキペディアで説明されているように)Mutexを実装するためにそれを使用できることを理解していますが、他にどのような用途がありますか?
c# - C# / ASP.NET - Web アプリケーションのロック
私は C#/ASP.NET Web アプリケーションに取り組んでおり、ロックを行う必要がある状況がいくつかあります。理想的には、ロックは互いに関係がないため、ロックが独立して動作することを望みます。[MethodImpl(MethodImplOptions.Synchronized)]
を使用するいくつかの方法を検討してきましたlock()
が、いくつかの質問/懸念があります。
MethodImplOptions.Synchronized will essentially do
lock(this)` のようです。その場合、同期メソッドに入るスレッドは、他のすべてのスレッドが同期メソッドに入るのをブロックするようです。そうですか?もしそうなら、これは十分な粒度ではありません。その時点で、Application.Lock を使用することもできそうです。(でも、間違っていたら訂正してください。)
に関してlock()
、私は何を渡す必要があるかを理解しようとしています。この目的のためだけに一連のオブジェクトを作成し、それぞれを異なるロックに使用する必要がありますか? より良い方法はありますか?
前もって感謝します!
sql-server - MS-SQL Server 2005: 別のスナップショットの場所を使用してマージ サブスクリプションを初期化する
1 年前に海外でのマージ レプリケーションを開始しましたが、今のところすべて順調に進んでいます。私の問題は、システムに非常に多くのデータがあるため、サブスクライバーのサーバーのいずれかがクラッシュすると大惨事になることです: 標準的な方法でサブスクリプションを再初期化するには数日かかります (私たちの接続は確かに遅いですが、すでに非常に高価です)! 私がフォローアップしているアイデアの中には、次のようなものがあります。
- 元のデータベースのコピーを作成し、それをフリーズし、プレーンでファイルをサブスクライバーに送信し、スナップショットを使用せずにレプリケーションを開始します。これは、古いバージョンの SQL で伝統的に行われてきたことですが、私には少し面倒に思えます:パブリッシャーのデータを読み取り専用モードにし、操作が完了するまですべてのレプリケーションを停止する必要があります。
- データのスナップショットを作成し、スナップショット ファイルを海外に送信し、サブスクライバーにインストールして、レプリケーション プロパティで新しいスナップショットの場所を別の場所として指定します。これは私には公平に思えます (進行中のレプリケーションを中断する必要はなく、データのフリーズもありません) が、この点では、Microsoft のヘルプは役に立ちません。
そんな状況を経験したことがある方もいらっしゃると思います。あなたの選択は何ですか?
編集:もちろん、「あなたのアイデアを試してみませんか」と言うことができますが、それには数時間かかります(SQLサーバー、仮想マシン、およびそのすべての複数のインスタンス...)、そして私それをやった人が自分の考えを説明するのに2分しかかからないだろうと思っていました. そして、誰かが私に何時間ものハードワークを割いてもらうために、2分間の時間を割いてくれるなら、私は最高に幸せです...
java - Java での String オブジェクトの同期
特に、数百人のユーザーが同じページにアクセスし、このページで約 10 秒ごとに更新を行うことが予想される機能について、いくつかの負荷/パフォーマンス テストを行っている Web アプリケーションがあります。この関数を使用して改善できることがわかった領域の 1 つは、データが変更されないため、Web サービスからの応答を一定期間キャッシュすることでした。
この基本的なキャッシングを実装した後、さらにいくつかのテストを行ったところ、並行スレッドが同時にキャッシュにアクセスする方法を考慮していないことがわかりました。約 100 ミリ秒以内に、約 50 のスレッドがキャッシュからオブジェクトをフェッチしようとしていて、有効期限が切れていることを発見し、Web サービスにアクセスしてデータをフェッチし、オブジェクトをキャッシュに戻していることがわかりました。
元のコードは次のようになります。
したがって、オブジェクトの有効期限が切れたときに 1 つのスレッドだけが Web サービスを呼び出していることを確認するにはkey
、キャッシュの get/set 操作を同期する必要があると考えました。同期します (この方法では、電子メール b@b.com に対するこのメソッドへの呼び出しは、a@a.com へのメソッド呼び出しによってブロックされません)。
メソッドを次のように更新しました。
また、「同期ブロックの前」、「同期ブロックの内側」、「同期ブロックを離れようとしています」、「同期ブロックの後」などのログ行を追加したので、get/set 操作を効果的に同期しているかどうかを判断できました。
ただし、これが機能しているようには見えません。テスト ログには次のような出力があります。
get/set 操作の前後で同期ブロックに出入りするスレッドを一度に 1 つだけ見たかったのです。
String オブジェクトの同期に問題はありますか? キャッシュキーは操作に固有であるため、良い選択だとfinal String key
思いました。メソッド内で宣言されていても、各スレッドが同じオブジェクトへの参照を取得するため、これで同期されると考えていました単一のオブジェクト。
ここで何が間違っていますか?
更新: ログをさらに調べたところ、次のように、キーが常に同じである同じ同期ロジックを持つメソッドのようです。
同じ並行性の問題は発生しません。一度に 1 つのスレッドだけがブロックに入ります。
更新 2 : 助けてくれてありがとう! ing Stringsに関する最初の回答を受け入れましたintern()
。これにより、最初の問題が解決されました。複数のスレッドが同期ブロックに入るべきではないと思っていた場所に、key
の値が同じであるためです。
他の人が指摘しているintern()
ように、そのような目的で使用し、それらの文字列を同期することは、実際には悪い考えであることが判明しました.webappに対してJMeterテストを実行して予想される負荷をシミュレートすると、使用されるヒープサイズが20分弱。
現在、メソッド全体を同期するだけの単純なソリューションを使用していますが、martinprobst と MBCook が提供するコード サンプルが非常に気に入っていますが、現在、このクラスには約 7 つの同様のメソッドgetData()
があるため (約 7 つの異なるデータが必要なため)ロックの取得と解放に関するほとんど重複したロジックを各メソッドに追加したくありませんでした。しかし、これは間違いなく、将来の使用にとって非常に価値のある情報です。これらは、このようなスレッドセーフな操作を行うための最善の方法に関する最終的な正解だと思います。できれば、これらの回答にもっと投票したいと思います!
svn - Team Foundation Server - API を使用して SVN に同期する
TFS の API を使用して、さまざまな種類のリポジトリを同期した人はいますか? TFS リポジトリと同期したい SVN リポジトリがあります。より正確には、SVN から時折 (毎晩) 最新のものをすべて取得し、最新バージョンとして TFS にダンプしたいだけです。
何かアドバイス?