Content-Length: 236344 | pFad | http://b.hatena.ne.jp/yass/atomic/
Comparing the performance of atomic, spinlock and mutex I was curious in benchmark of different synchronization mechanisms: atomic, spinlock, mutex. Without synchronization #include <future> #include <iostream> volatile int value = 0; int loop(bool inc, int limit) { std::cout << "Started " << inc << " " << limit << std::endl; for (int i = 0; i < limit; ++i) { if (inc) { ++value; } else { --value;
ConcurrentHashMapを使うときの注意点 タイトルの通りです。 ConcurrentHashMapは同期を取りつつ、パフォーマンスも優れたとても優秀なやつで、最近Webアプリケーションで、キャッシュみたいなものを作るときに使いました。 とはいえ同期を取るとはいっても以下のようなキーの存在を確認して、putするような複合アクションの呼び出し(いわゆるcheck-then-act)では同期されません。(別にこれは、従来のHahMapとかCollections.syncronizedMapとかでも同じです) // atomicではない操作。 if(!map.containsKey(key)) { map.put(key, value); } 以下が実証コードで、実行すると高い確率で複数スレッドで同一キーへのputを行います。 (今回のケースだとあまり問題にならないですが、valueを
ハートビーツ最年長エンジニアの滝澤です。以前、弊社CTOにシニアおっさんエンジニアから若手エンジニアに向けて何か書いてくれと言われた気がしたので、アトミック(atomic)なファイル操作について3編に分けて紹介します。この内容は弊社の社内勉強会で話した内容をまとめ直したものです。 そのファイル、安全に更新できていますか?(アトミックなファイル操作:前編)←今回 そのファイル、安全に作成できていますか?(アトミックなファイル操作:中編) そのファイル、安全にロックできていますか?(アトミックなファイル操作:後編) 今回は「みなさん、安全にファイルの更新ができていますか?」ということについて、考えてみましょう。 あなたはあるサーバ上のファイルの更新を依頼され、もらったファイルをサーバ上でコピーして上書きしました。しばらくして、データに異常が発生したので調べて欲しいと言われました。さて、何が起き
ちょっと使うことがあったので、備忘録的にGCCの組込みアトミック命令の使い方についてまとめておきます。 前提知識 マルチスレッドプログラムにおいて、共有データを更新する際の定石は spin lock や mutex でデータを保護することです。 これらの道具は多くの場面において十分便利なのですが、例えば共有データが1個の int 変数のみであり、更に高頻度で更新が行われるといった場合にはやや同期のコストが高くついてしまいます。 そのような場合には、アトミック命令を用いることで同期オーバーヘッドを抑えることができます。 アトミック命令とは、複数のスレッドから実行されても、個々の命令が一つ一つ順番に適用されてゆくことが保証されている命令のことです。 (より正確には、個々の命令がとある順番で一つ一つ適用された時と同じ結果を得られることが保証されている命令のことです) 例えば、とある変数 X の値
メモリアクセスの排他制御 2つのプロセサが使用するメモリ領域が異なり、別々の仕事を分担する場合は問題ないのであるが、2つのプロセサで緊密に関係のあるデータを扱っている場合には問題が発生しうる。図9.19に示した預金引き出しの例では、残高と引き出し額を比較し、残高が十分にあれば残高から引き出し額を引き、引き出し額をATMから払い出す。 ここで、当初の残高が10万円の口座に対して、プロセサ1が8万円の引出し要求を受け付け、(1)で残高を読み処理を開始するが、それより一瞬遅れて、プロセサ2が同じ口座からの5万円の引出し要求を受け付けて(2)で残高を読むと、両方とも読み込んだ残高は10万円になってしまう。そしてプロセサ1が引出し処理を終わって(3)で残高に2万円と書き込むが、続いてプロセサ2が10万円-5万円=5万円で、(4)で残高に5万円と書き込んでしまう。つまり、10万円の残高の口座から、合計
Introduction Atomic operations are the building blocks of synchronization primitives and non-blocking algorithms. They guarantee that, when modifying a memory location, it will happen without any interference from other threads. They are required whenever writing applications for multiple-cores architectures. Consider this function: void NonAtomicAND(tS32* Value, tS32 Op) { *Value &= Op; } Which t
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く
Fetched URL: http://b.hatena.ne.jp/yass/atomic/
Alternative Proxies: