問題タブ [atomic]
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++ 実装は Atomic float に対して安全ですか?
編集:ここのコードにはまだいくつかのバグがあり、パフォーマンス部門では改善される可能性がありますが、これを修正しようとする代わりに、記録として、インテルのディスカッション グループに問題を持ち込んで、多くの素晴らしいフィードバックを得ました。すべてがうまくいけば、Atomic float の洗練されたバージョンが Intel の Threading Building Blocks の近い将来のリリースに含まれる予定です。
これは難しい問題です。超高速のグラフィックス パフォーマンスのためではなく、クラスのデータ メンバーとして日常的に使用するために、Atomic float が必要です。また、これらのクラスでロックを使用することによる代償を払いたくありません。それは、私のニーズに対して追加の利点を提供しないからです。
intel の tbb と私が見た他のアトミック ライブラリでは、整数型はサポートされていますが、浮動小数点はサポートされていません。それで私は続けて実装しましたが、うまくいきました...しかし、それが本当にうまくいくかどうかはわかりません。
これがある種のスレッド異端ではないかどうか、ここにいる人は誰でも知っていますか?
ありがとう!
編集: Greg Rogers が提案したように size_t を uint32_t に変更しました。
編集:いくつかの修正を加えて、全体のリストを追加しました。
その他の編集:私のマシンで 100 スレッドで 5.000.000 += 操作にロックされたフロートを使用すると、3.6 秒かかりますが、愚かな do-while を使用しても、同じ作業を行うには 0.2 秒かかります。したがって、30 倍を超えるパフォーマンスの向上は、その価値があることを意味します (これが問題です)。
さらに編集: Awgn が指摘したように、私のfetch_and_xxxx
パーツはすべて間違っていました。それを修正し、よくわからない API の部分を削除しました (テンプレート化されたメモリ モデル)。コードの繰り返しを避けるために、演算子 += に関して他の操作を実装しました
追加:演算子 *= と演算子 /= が追加されました。フロートはそれらがなければフロートにならないためです。これに気付いたというピーターチェンのコメントのおかげで
編集:コードの最新バージョンは次のとおりです(参照用に古いバージョンを残します)
multithreading - SetEvent はアトミックですか?
クリティカル セクションで保護されていない同じイベント ハンドラーで、2 つ以上のスレッドが Win32 API の SetEvent を呼び出すのは安全ですか?
winapi - Win32: コード ブロックのアトミック実行
特定の Win32 スレッドによる CPU 使用率を計算するために必要な 2 つのシステム コール GetSystemTime() と GetThreadTimes() があります。
正確を期すために、GetSystemTime() と GetThreadTimes() の両方がアトミックに実行されるようにする必要があります。つまり、GetSystemTime() と GetThreadTimes() の呼び出しの間にコンテキスト スイッチがあってはなりません。
その理由は、ときどき 100% を超えるパーセンテージ (~ 500 分の 1) になるからです。
2 つの関数呼び出しをアトミックに実行するにはどうすればよいですか?
ありがとう、サチン
linux - ディレクトリをアトミックに移動する
同じ親ディレクトリに2つのディレクトリがあります。親ディレクトリベースと子ディレクトリalphaおよびbravoを呼び出します。alphaをbravoに置き換えたい。最も簡単な方法は次のとおりです。
mvコマンドはアトミックですが、rm-rfはアトミックではありません。アルファをブラボーにアトミックに置き換えるbashの簡単な方法はありますか?そうでない場合、複雑な方法はありますか?
補遺:
ちなみに、ディレクトリが短期間存在しなくても、克服できない問題ではありません。アルファにアクセスしようとする場所は1つだけであり、重要なことを行う前にアルファが存在するかどうかをチェックします。そうでない場合は、エラーメッセージが表示されます。しかし、これを行う方法があればいいのですが。:)iノードを直接変更する方法があるかもしれません。
django - Django:データベースエントリの同時変更から保護するにはどうすればよいですか?
2人以上のユーザーによる同じデータベースエントリの同時変更から保護する方法はありますか?
2番目のコミット/保存操作を実行しているユーザーにエラーメッセージを表示することは許容されますが、データを黙って上書きしないでください。
ユーザーが「戻る」ボタンを使用するか、単にブラウザを閉じて、ロックを永久に残す可能性があるため、エントリをロックすることはオプションではないと思います。
mysql - 2つ以上のテーブルとビューをアトミックに名前変更/置換できますか?
テーブルXとビューY(Xと同じ構造を持つ)が与えられた場合、XをZに、YをXにアトミックに名前変更して、クエリにXという名前の何も表示されないようにする方法はありますか?Xの名前を変更してビューを作成することも有効です。
重要なのは、スキーマ移行計画の一環として、古いテーブルを新しいバージョンの古いバージョンをシミュレートするビューに置き換えて、クライアントコードの両方のセットを同時に実行できるようにすることです。
MySQLが私の選択ですが、他の人に関する情報も役立つでしょう。
queue - POSIXセマフォのみを使用してウェイクアップ待機レースを回避することは可能ですか?良性ですか?
POSIXセマフォを使用して、キューを表すファイルからのアトミックなgetおよびputを管理したいと思います。完全に無関係なプロセスがキューを共有できるように、ファイルシステムに名前を付ける柔軟性が必要です。この計画ではpthreadが除外されていると思います。名前付きのposixセマフォは、すべてのプロセスが認識できるものをファイルシステムに配置するのに最適ですが、標準のCondWaitプリミティブが見つかりません。
CondWaitがプロセスによって呼び出されると、アトミックにsemに投稿され、condを待機します。他のプロセスがcondにポストするとき、待機中のプロセスは、semもアトミックにデクリメントできる場合にのみウェイクアップします。の代替
このプロセスが待機する直前に、他のプロセス信号が競合状態になるという競合状態が発生します。
並行プログラミングを行うことはほとんどないので、SOに尋ねると思いました。条件変数に標準のPOSIXカウントセマフォを使用する場合、このレースは良性である可能性がありますか?
誰かがより大きなコンテキストを必要とする場合に備えて、シェルスクリプトから呼び出すことができるアトミックキューのgetおよびput操作を構築しています。
.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操作の間にたまたまそれを実行する可能性が非常に低いことに依存する必要があります。万が一に備えて、すべての拠点をカバーしたいと思います。
編集:サンプルコードを使用した具体的な回答が得られたので、質問のタイトルを書き直して、回答が役立つユースケースをより一般的に反映し、より明確にしました。また、「アトミック」のタグを追加しました。
perl - Perlでクロスプラットフォームのアトミックファイル置換を行う最良の方法は何ですか?
私は非常に一般的な状況を持っています。ファイルがあり、そのファイルを新しい内容で完全に上書きする必要があります。ただし、元のファイルはページが読み込まれるたびにアクセスされるため (これは Web アプリです)、長い間失われることはありません。数ミリ秒は問題ありませんが (理想的ではありません)、1 秒も問題ありません。
現在、一時ファイルを同じディレクトリに書き込み、その一時ファイルの名前を新しいファイルの名前に変更することでこれを行っています。Perl では、通常の File::Temp と "rename" を使用してこれを行っています。私は疑問に思っていました-これを行うための他の推奨/より良い方法はありますか? できれば CPAN モジュールを必要としないモジュールが望ましいです。私のシステムでこれを行う必要があるのはここだけであり、このためだけにまったく新しい依存関係を作りたくないからです。
ああ、これらはすべて、Windows、Linux、BSD、OS X、Solaris、およびその他の一般的なプラットフォームで動作する必要があります。
興味のある方のために、問題のコードを次に示します。