下面是关于"C++11 atomic的使用详解"的完整攻略。
什么是atomic
atomic
是一个C++11标准中的类模板,可用于实现原子操作。原子操作是一种不可分割的操作,要么成功执行,要么不执行,不会被其他线程中断。使用atomic可以确保并发访问下的线程安全。
基础用法
atomic支持内部类型如int、long等的原子操作。下面是一些基本的示例:
#include <iostream>
#include <atomic>
int main()
{
std::atomic<int> counter(0); // 定义原子变量
counter.fetch_add(1); // 原子加1
std::cout << counter.load() << std::endl; // 输出1
counter.fetch_sub(2); // 原子减2
std::cout << counter.load() << std::endl; // 输出-1
counter.store(10); // 原子赋值
std::cout << counter.load() << std::endl; // 输出10
return 0;
}
上面的例子中,我们定义了一个原子变量counter
,进行了加、减、赋值操作,并通过load()方法获取当前的值。
原子类型
C++11提供了以下几种原子类型:
std::atomic<bool>
std::atomic<char>
std::atomic<short>
std::atomic<int>
std::atomic<long>
std::atomic<long long>
std::atomic<unsigned char>
std::atomic<unsigned short>
std::atomic<unsigned int>
std::atomic<unsigned long>
std::atomic<unsigned long long>
std::atomic<void *>
std::atomic<std::nullptr_t>
其中,bool类型只定义了atomically useful objects,因此不能使用fetch_add等方法。
原子变量和非原子变量的转换
atomic支持与非原子类型之间的互相转换。下面是一个转换的示例:
#include <iostream>
#include <atomic>
int main()
{
int x = 10;
std::atomic<int> counter(x); // 原子变量赋予非原子变量的值
std::cout << counter.load() << std::endl; // 输出10
x = 20;
counter.store(x); // 将非原子变量的值赋值给原子变量
std::cout << counter.load() << std::endl; // 输出20
return 0;
}
示例一:原子变量计数器
下面是一个使用原子变量实现线程安全计数器的示例:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> counter(0);
void increment()
{
for (int i = 0; i < 10000; ++i)
{
counter.fetch_add(1);
}
}
int main()
{
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Counter: " << counter.load() << std::endl;
return 0;
}
上面的例子中,我们定义了一个原子变量counter
,并创建了两个线程,在每个线程中分别使用fetch_add()
方法进行加1操作,各自进行一万次操作,最后输出计数器的值。
示例二:原子锁
下面是一个使用原子变量实现原子锁的示例:
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<bool> lock(false);
void acquire()
{
bool expected = false;
while (!std::atomic_compare_exchange_weak(&lock, &expected, true))
{
expected = false;
}
}
void release()
{
lock.store(false);
}
void func()
{
acquire();
std::cout << "Lock acquired" << std::endl;
// 执行一些操作
release();
std::cout << "Lock released" << std::endl;
}
int main()
{
std::thread t1(func);
std::thread t2(func);
t1.join();
t2.join();
return 0;
}
上面的例子中,我们定义了一个原子变量lock
,使用std::atomic_compare_exchange_weak
方法实现了原子锁的获取和释放操作。
总结
上面我们详细介绍了C++11中atomic的基础用法、原子类型、原子变量和非原子变量的转换,以及一些示例应用,这些内容可以帮助我们更加准确并发的控制程序。
如果有需要请参考以上攻略,具有良好的可读性和可执行性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++11 atomic的使用详解 - Python技术站