問題タブ [locking]
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.
vba - Excel 2003 から 2007 にアップグレードすると、以前に動作していた vba で「スタック オーバーフロー エラー」が発生する
次の VBA コードは、Excel 2003 ではうまく機能しますが、Excel 2007 ではスタック オーバーフロー エラーが発生します。コードは、ドロップダウン メニューの選択に基づいて特定のセルのロックを解除またはロックする必要があります。Excel 2003 と 2007 の両方でコードを実行できるようにする必要があります。助けてください。
sql-server - Sql Server 2005 - テーブルの同時実行を管理する
私はASP.NETアプリケーションにこのプロセスを持っています:
- 接続を開始する
- 取引を開始する
- 特定の LoadId を含む列を持つ SqlBulkCopy クラスを使用して、テーブル「LoadData」に多くの値を挿入します。
- 次のようなストアド プロシージャを呼び出します。
- 特定の LoadId のテーブル「LoadData」を読み取ります。
- 各行に対して、多数のテーブルを読み取り、結果を一時 (#temp) テーブルに書き込むことを意味する多くの計算を行います (数分間続くプロセス)。
- 特定の LoadId の「LoadDate」の行を削除します。
- すべてが完了したら、結果を結果テーブルに書き込みます。
- 何かが失敗した場合は、トランザクションをコミットするかロールバックします。
私の問題は、プロセスを開始する2人のユーザーがいる場合、2番目のユーザーは前のユーザーが終了するのを待たなければならず(挿入によりテーブルに排他ロックが設定されているように見えるため)、アプリケーションがタイムアウトになることがあります(そしてユーザーは待ちきれません:))。
最後のものを除いて相互作用がないため、ユーザーがすべてを並行して実行できるようにする方法を探しています:結果の書き込み。私を妨げているのは、「LoadData」テーブルの挿入/削除だと思います。他のトランザクション分離レベルを確認しましたが、何も役に立たないようです。
挿入が終了したときに、トランザクションを終了せずに、「LoadData」テーブルの排他ロックを削除できるようにすることは完璧です (SqlServer にテーブルではなく行のみを強制的にロックさせることは可能ですか?)。
なにか提案を?
.net-2.0 - コンソール出力をログに記録するためにConsole.Outをリダイレクトするためのget-and-set操作のアトミック性をどのように確認できますか?
ログ用にコンソール出力ストリームをキャプチャするために、コンソール出力ストリームをインターセプトする必要がありますが、アプリケーションが正しく動作するように、元のストリームに物事を渡します。これは明らかに、元のConsole.Out
TextWriterを。で変更する前に保存することを意味しConsole.SetOut(new MyTextWriterClass(originalOut))
ます。
Outプロパティを取得し、SetOut()メソッドを呼び出す個々の操作はConsole
、スレッドセーフな方法で実装されていると思います。ただし、他のスレッド(たとえば、制御できず、変更を期待できないクライアントアプリケーションコードを実行しているため、独自のカスタムロックスキームに依存できない)ができないことを確認したいと思います。 getとsetの間に誤って変更し、変更によって上書きされてしまいます(アプリケーションの動作が壊れます!)。他のコードは単にSetOut()を呼び出す可能性があるため、私のコードは理想的にConsole
は(1つあると仮定して)内部で使用されるのと同じロックを取得する必要があります。
残念ながら、Console
これは(静的)クラスであり、インスタンスではないため、単にlock (Console)
。また、クラスのドキュメントを見ると、ロックについては何も言及されていないようです。これは、これらのコンソールメソッドの通常予想される使用法ではありませんが、アトミック操作としてこれを行うための安全な方法があるはずです。
標準のロックスキームに失敗しましたが、これを確実にする他の方法はありますか?このような短いクリティカルセクション(および1回だけ実行)の場合、それが唯一の方法である場合は、他のすべてのスレッドを一時的にブロックすることも許容される場合があります。C#と.NET2.0を使用しています。
それでも(クライアントアプリケーションを中断せずに)可能でない場合は、クライアントアプリケーションがコンソール出力をリダイレクトし、get操作とset操作の間にたまたまそれを実行する可能性が非常に低いことに依存する必要があります。万が一に備えて、すべての拠点をカバーしたいと思います。
編集:サンプルコードを使用した具体的な回答が得られたので、質問のタイトルを書き直して、回答が役立つユースケースをより一般的に反映し、より明確にしました。また、「アトミック」のタグを追加しました。
python - プログラムのインスタンスが 1 つだけ実行されていることを確認する
プログラムのインスタンスを 1 つだけ実行する Pythonic の方法はありますか?
私が思いついた唯一の合理的な解決策は、あるポートでサーバーとして実行しようとすることです。次に、同じポートにバインドしようとする2番目のプログラムが失敗します。しかし、それは本当に素晴らしいアイデアではありません。これよりも軽量なものがあるのではないでしょうか?
(プログラムが時々失敗することが予想されることを考慮してください。つまり、segfault-「ファイルのロック」などは機能しません)
c# - ReaderWriterLockSlim UpgradeableReadLock を単純な ReadLock にダウングレードする
のドキュメントにReaderWriterLockSlim.EnterUpgradeableReadLock
は次のように書かれています:
アップグレード可能モードのスレッドは、読み取りモードにダウングレードするか、書き込みモードにアップグレードできます。
ロックを読み取りロックにダウングレードするにはどうすればよいですか? ドキュメントは教えてくれません...
[編集:] 書き込みロックを取得しようとしているわけではありません。別のスレッドがアップグレード可能なロックを取得できるように、アップグレード可能なロックを読み取りロックにダウングレードしたいだけです。
.net - ReaderWriterLockSlim を使用するとメモリバリアが発生しますか?
を使用ReaderWriterLockSlim
して読み取り/書き込みロックを取得する場合、変数を作成する必要がありvolatile
ますかInterlocked.Increment
?
たとえば、Add
以下のメソッドのコードは正常に機能しますか?それとも拡張が必要ですか?
編集:複数のスレッドがデータに同時にアクセスできるようにする軽量で高速でシンプルなリストを作成しようとしています(一種のプロデューサー/コンシューマーバッファー)。上記のコードを編集して、以前に使用した簡略化を削除したので、問題がより明確になるはずです。このコードはスレッドセーフであるように思えますがCount
、アップグレード可能なロックを終了した直後にすべてのスレッドが の更新された値を見るかどうかはわかりません。
編集 2 : ここでの「書き込み」ロックは、配列要素ではなく、配列参照への書き込みを示すために使用されます。これで十分だと思います (データ自体は不変であるため)。インクリメントするときは Interlocked を使用する必要があると思いますCount
。本当?
sql-server - T-SQLの悲観的ロック
MS SQL Serverで更新する行を選択し、更新またはキャンセルするまで行をロックしたい場合は、どちらのオプションの方が適していますか:-
1)UPDLOCKのようなクエリヒントを使用します。2)トランザクションにREPEATABLE READ分離レベルを使用します。3)その他のオプション。
ありがとう、チャク。
.net - ManualResetEvent の状態を確認するにはどうすればよいですか?
のインスタンスを使用ManualResetEvent
してリソースへのスレッド アクセスを制御していますが、問題が発生しています。デバッグ中にオブジェクトの状態を知る方法を知っている人はいますか?
つまり、ManualResetEvent
が現在ブロックしているスレッドがあるかどうか、ブロックしているスレッドの数とスレッドを知りたいということです。
postgresql - Postgresqlでロック解除された行を選択します
ロックされていないPostgresqlの行を選択する方法はありますか?私は次のことを行うマルチスレッドアプリを持っています:
テーブルの上。
複数のスレッドがこのクエリを実行する場合、両方が同じ行を引き戻そうとします。
1つは行ロックを取得し、他はブロックし、最初のブロックが行を更新した後に失敗します。私が本当に望んでいるのは、2番目のスレッドが、WHERE
句に一致し、まだロックされていない最初の行を取得することです。
明確にするために、selectを実行した後、各スレッドが最初に使用可能な行をすぐに更新するようにします。
したがって、の行がある場合はID: 1,2,3,4
、最初のスレッドが入り、の行を選択しID=4
てすぐに更新します。
ID=3
そのトランザクション中に2番目のスレッドが来た場合は、その行を取得してすぐにその行を更新したいと思います。
句がロックされた行と一致するnowait
ため、Shareはこれを達成しません。基本的に私が欲しいのは、条項の「ANDNOTLOCKED」のようなものです。WHERE
(ID=4 in my example)
WHERE
クエリが" Select ID from users where flags = 0 order by ID desc limit 1
"で、行が返されたときに次のものが " Update Users set flags = 1 where ID = 0
"の場合、最初のスレッドで行を取得し、次のスレッドで。ID 4
で行を取得しID 3
ます。
selectに""を追加For Update
すると、最初のスレッドが行を取得し、2番目のスレッドがブロックして、最初のトランザクションがコミットされるとWHERE
句が満たされないため、何も返されません。
""を使用しない場合はFor Update
、後続の更新でWHERE句を追加する必要があります(WHEREフラグ= 0)。これにより、1つのスレッドのみが行を更新できます。
2番目のスレッドは最初のスレッドと同じ行を選択しますが、2番目のスレッドの更新は失敗します。
いずれにせよ、トランザクションが重複する最初のスレッドに行4を、2番目のスレッドに行3を与えるデータベースを取得できないため、2番目のスレッドは行の取得と更新に失敗します。