linuxでサポートされている操作はどれがアトミックですか?これらのことを知ることは、ロックフリー プログラミング アルゴリズムを理解して設計するための基礎となります。
以下はインターネット上からまとめたものです。事前に共有していただきありがとうございます!
sync_fetch_and_add コマンドシリーズ。英語が得意な生徒は、原文に直接アクセスできます。マルチスレッドのシンプルなデータ型アクセスとアトミック変数
sync_fetch_and_add シリーズには、add/subtract/and/or/exclusive or/などのアトミック操作関数 sync_fetch_and_add を含む、合計 12 の 関数 があり、その名前が示すように、最初にフェッチします。 , その後、それ自体がインクリメントされ、インクリメント前の値が返されます。 count = 4 を例にとると、sync_fetch_and_add(&count,1) を呼び出した後、戻り値は 4 になり、その後カウントは 5 になります。
sync_fetch_and_add があり、当然 sync_add_and_fetch もあります。ははは、これは という意味です。はっきりしています。最初に自分で追加してから戻ります。二人の兄弟の関係は、i++ と ++i の関係と同じです。タン・ハオ強氏にレイプされたことのある人、あるいは彼の年長者からみかじめ料を受け取った人なら誰でも、それをはっきりと知っているだろう。
このベビー機能により、新しいソリューションが得られます。マルチスレッドがグローバル 変数 を自己インクリメントするために、スレッド ロックに対処する必要がなくなりました。次のコード行は、上記の pthread_mutex によって保護されたコード行と同じ効果があり、スレッドセーフでもあります。
以下は、この関数グループの概要です。名前を見れば、これらの関数が何を行うかがわかります。
// sam:在我的服务器上,发现不加都可以。
type sync_fetch_and_add (type *ptr, type value);type sync_fetch_and_sub (type *ptr, type value);type sync_fetch_and_or (type *ptr, type value);type sync_fetch_and_and (type *ptr, type value);type sync_fetch_and_xor (type *ptr, type value);type sync_fetch_and_nand (type *ptr, type value);type sync_add_and_fetch (type *ptr, type value);type sync_sub_and_fetch (type *ptr, type value);type sync_or_and_fetch (type *ptr, type value);type sync_and_and_fetch (type *ptr, type value);type sync_xor_and_fetch (type *ptr, type value);type sync_nand_and_fetch (type *ptr, type value);
// サム: なぜ最後に省略記号があるのか非常に混乱しています。何かパラメータがあるのですか。私たちが気にする必要はないということですか?使用時にパラメータを渡す必要はありませんか?次の 2 つの関数はまさに私が望んでいたものであり、簡単にミューテックスロック機能を実装できます。
bool sync_bool_compare_and_swap (type*ptr, type oldval, type newval, ...)
type sync_val_compare_and_swap (type *ptr, type oldval, type newval, ...)
これら 2 つの関数はアトムの比較を提供します*ptr == oldval の場合、newval を *ptr に書き込みます。
それらが等しく書き込まれた場合、最初の関数は true を返します。
2 番目の関数は、演算値の前に戻ります。
上記を理解するには、blog.sunchangming.com/post/47188394133 を参照してください
2 つの関数もあります:
type sync_lock_test_and_set (type *ptr, type value, ...)
*ptr を value に設定し、*ptr 操作前の値を返します。
void sync_lock_release (type *ptr, ...)
*ptr を 0 に設定
以上がLinuxのロックフリー例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。