//C++中的原子操作是一种线程同步机制,用于确保多个线程之间的数据访问不会导致竞态条件。
//原子操作是一种特殊的操作,它们可以在单个CPU时钟周期内完成,而且在执行期间不会被中断。

//C++11引入了原子类型和原子操作,这些类型和操作可以用于确保多个线程之间的同步。

//以下是一些常见的原子类型和操作:

//1. std::atomic<T>:表示一个原子对象,其中T是一个基本类型,如int、float等。
//1.1 std::atomic_bool:布尔类型原子变量
//1.2. std::atomic_char:字符类型原子变量
//1.3. std::atomic_short:短整型原子变量
//1.4. std::atomic_int:整型原子变量
//1.5. std::atomic_long:长整型原子变量
//1.6. std::atomic_long_long:长长整型原子变量
//1.7. std::atomic_uint:无符号整型原子变量
//1.8. std::atomic_ushort:无符号短整型原子变量
//1.9. std::atomic_ulong:无符号长整型原子变量
//1.10. std::atomic_ulong_long:无符号长长整型原子变量
//1.11. std::atomic_size_t:size_t 类型原子变量
//1.12. std::atomic_ptrdiff_t:ptrdiff_t 类型原子变量


//2. std::atomic_flag:表示一个原子标志,只能设置或清除。

//3. std::atomic<T>::load():从原子对象中读取值。

//4. std::atomic<T>::store():将值存储到原子对象中。

//5. std::atomic<T>::exchange():交换原子对象中的值,并返回原来的值。

//6. std::atomic<T>::compare_exchange_weak()和std::atomic<T>::compare_exchange_strong():
//比较原子对象的值与期望值,如果相等,则将新值存储到原子对象中。

//使用原子操作可以避免多个线程同时访问同一数据时出现的竞态条件,从而确保程序的正确性和可靠性。

//示例代码:

//c++
#include <iostream>
#include <atomic>
#include <thread>

std::atomic<int> counter(0);

void increment() 
{
    for (int i = 0; i < 1000000; ++i) 
    {
        counter.fetch_add(1, std::memory_order_relaxed);
    }
}

int main() 
{
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();
    std::cout << "Counter value: " << counter.load() << std::endl;
    return 0;
}
//

//上面的代码创建了两个线程,每个线程都会对原子变量 counter 进行 1000000 次自增操作。
//最后输出原子变量的值。注意,这里使用了 fetch_add() 函数来进行自增操作,它会返回自增前的值。
//同时,使用了 memory_order_relaxed 参数来指定内存序,表示不需要保证原子性,只需要保证顺序性。

06-13 10:32