std::atomic<bool>使用例子
时间: 2023-08-08 17:06:18 浏览: 51
以下是一个使用std::atomic<bool>的例子:
```
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<bool> flag(false); // 全局的std::atomic<bool>变量
void thread_func()
{
while (!flag.load()) // 检测flag的状态
{
// do something
}
std::cout << "thread_func exits." << std::endl;
}
int main()
{
std::thread t(thread_func); // 创建一个新线程
// do something
flag.store(true); // 线程退出时设置flag的状态
t.join(); // 等待子线程退出
std::cout << "main exits." << std::endl;
return 0;
}
```
在上面的例子中,我们创建了一个全局的std::atomic<bool>变量flag,并在主线程中设置了它的状态为true。在子线程中,我们不断地检测flag的状态,直到它的状态被设置为true,此时子线程会退出。通过使用std::atomic<bool>,我们可以保证在多线程环境下对flag变量的操作是原子的。
相关问题
c++14 std::atomic_bool
std::atomic_bool是C++14中的原子布尔类型。它提供了原子操作,以确保多线程环境下的安全性。它可以用于实现锁、同步和并发算法等。使用std::atomic_bool可以保证对布尔类型的读写操作在多线程环境中是原子的,即不会发生竞态条件。
在C++14中,std::atomic_bool比std::atomic_flag功能更全,可以使用非原子的bool来赋值和初始化。例如,你可以这样使用std::atomic_bool:
std::atomic_bool b(true);
b = false;
这样就可以对b进行原子的赋值操作。
需要注意的是,std::atomic_flag由于限制性甚至不能用作一个通用的布尔标识,所以最好还是使用std::atomic_bool。在C语言中,也可以使用自旋锁来实现多线程的同步。以下是一个使用自旋锁实现的例子:
#include <thread>
#include <vector>
#include <iostream>
#include <atomic>
std::atomic_flag lock = ATOMIC_FLAG_INIT;
void f(int n) {
for (int cnt = 0; cnt < 5; cnt++) {
while (lock.test_and_set(std::memory_order_acquire))
; // 自旋
std::cout << "Thread " << n << " count:" << cnt << std::endl;
lock.clear(std::memory_order_release); // 释放锁
}
}
int main(int argc, char* argv[]) {
std::vector<std::thread> v;
for (int n = 0; n < 4; n++) {
v.emplace_back(f, n); //使用参数进行初始化
}
for (auto& t : v) {
t.join(); //等待线程结束
}
system("pause");
return 0;
}
这个例子中,使用std::atomic_flag作为锁,通过test_and_set()和clear()函数来获得锁和释放锁。
总结来说,std::atomic_bool是C++14中的原子布尔类型,可以用于多线程环境下的安全操作。在C语言中,可以使用自旋锁来实现多线程的同步。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
rust有没有类似std::atomic_bool
是的,Rust有类似于std::atomic_bool的功能。它被称为AtomicBool,属于std::sync::atomic模块。AtomicBool是一个原子布尔值,可以在多线程环境中安全地访问和修改。以下是一个使用AtomicBool的示例:
```rust
use std::sync::atomic::{AtomicBool, Ordering};
fn main() {
let my_bool = AtomicBool::new(false);
// Set the value of the AtomicBool
my_bool.store(true, Ordering::SeqCst);
// Get the value of the AtomicBool
let value = my_bool.load(Ordering::SeqCst);
assert_eq!(value, true);
}
```
在这个例子中,我们创建了一个名为my_bool的AtomicBool,初始值为false。然后我们使用store方法将其设置为true,使用load方法获取其当前值,并使用assert_eq!宏断言它等于true。注意,store和load方法都需要一个Ordering参数,这个参数指定了内存访问的顺序。在这个例子中,我们使用了SeqCst(Sequentially Consistent),这是最常用的顺序。它保证了所有线程对内存的访问顺序是一致的,因此可以保证数据的正确性。