std::sync::atomic - アトミック操作
ロックフリーのアトミック操作。カウンタやフラグなどの単純な共有変数に使用します。
対応バックエンド: Native (LLVM) のみ
最終更新: 2026-02-08
基本的な使い方
import std::sync::atomic::store_i32;
import std::sync::atomic::load_i32;
import std::sync::atomic::fetch_add_i32;
import std::thread::spawn;
import std::thread::join;
import std::io::println;
int counter = 0;
void* increment(void* arg) {
for (int i = 0; i < 1000; i++) {
fetch_add_i32(&counter, 1);
}
return 0 as void*;
}
int main() {
store_i32(&counter, 0);
ulong t1 = spawn(increment as void*);
ulong t2 = spawn(increment as void*);
join(t1);
join(t2);
int result = load_i32(&counter);
println("Counter: {result}"); // 2000
return 0;
}
Compare-and-Swap (CAS)
ロックフリーアルゴリズムの基本操作です。
import std::sync::atomic::compare_exchange_i32;
import std::sync::atomic::load_i32;
int shared = 0;
// アトミックに値を更新(CASループ)
void atomic_update(int* ptr, int new_value) {
int expected = load_i32(ptr);
while (!compare_exchange_i32(ptr, &expected, new_value)) {
// expectedには現在の値が書き戻される
// ループして再試行
}
}
API一覧
int (32-bit)
| 関数 | 戻り値 | 説明 |
|---|---|---|
load_i32(ptr) |
int |
アトミック読み取り |
store_i32(ptr, value) |
void |
アトミック書き込み |
fetch_add_i32(ptr, value) |
int |
加算して旧値を返す |
fetch_sub_i32(ptr, value) |
int |
減算して旧値を返す |
compare_exchange_i32(ptr, &expected, desired) |
bool |
CAS操作 |
long (64-bit)
| 関数 | 戻り値 | 説明 |
|---|---|---|
load_i64(ptr) |
long |
アトミック読み取り |
store_i64(ptr, value) |
void |
アトミック書き込み |
fetch_add_i64(ptr, value) |
long |
加算して旧値を返す |
fetch_sub_i64(ptr, value) |
long |
減算して旧値を返す |
compare_exchange_i64(ptr, &expected, desired) |
bool |
CAS操作 |
Mutex vs Atomic
| 比較 | Mutex | Atomic |
|---|---|---|
| ロック | あり | なし(ロックフリー) |
| 複数フィールドの同時更新 | ✅ 可能 | ❌ 1変数のみ |
| パフォーマンス | やや遅い | 高速 |
| 用途 | 複雑な共有状態 | カウンタ、フラグ |