C++ 面试题 目录

C++ 中原子操作 (atomic operation) 的概念和用法

推荐答案

在C++中,原子操作是指在多线程环境下,某个操作要么完全执行,要么完全不执行,不会被其他线程打断。C++11引入了<atomic>头文件,提供了对原子操作的支持。通过使用std::atomic模板类,可以实现对基本数据类型的原子操作。

示例代码

-- -------------------- ---- -------
-------- --------
-------- ----------
-------- --------

---------------- -----------

---- ------------------- -
    --- ---- - - -- - - ----- ---- -
        -------------------- ---------------------------
    -
-

--- ------ -
    ----------- ----------------------
    ----------- ----------------------

    ----------
    ----------

    --------- -- -------- ------ - -- ------- -- ----------
    ------ --
-

关键点

  • std::atomic 提供了对基本数据类型的原子操作。
  • fetch_add 是一个原子操作,用于增加原子变量的值。
  • std::memory_order_relaxed 指定了内存顺序,表示操作可以以任意顺序执行。

本题详细解读

原子操作的概念

原子操作是指在多线程环境中,某个操作要么完全执行,要么完全不执行,不会被其他线程打断。原子操作通常用于实现线程安全的计数器、标志位等。

std::atomic

std::atomic 是C++11引入的模板类,用于封装基本数据类型(如intbool等),使其支持原子操作。通过std::atomic,可以确保在多线程环境下对变量的操作是线程安全的。

常用原子操作

  • load(): 原子地读取变量的值。
  • store(): 原子地写入变量的值。
  • fetch_add(): 原子地将变量的值增加指定的量。
  • fetch_sub(): 原子地将变量的值减少指定的量。
  • exchange(): 原子地将变量的值替换为指定的值,并返回旧值。
  • compare_exchange_weak()compare_exchange_strong(): 原子地比较并交换变量的值。

内存顺序

C++11引入了内存顺序的概念,用于控制原子操作的内存可见性。常见的内存顺序包括:

  • std::memory_order_relaxed: 最宽松的内存顺序,操作可以以任意顺序执行。
  • std::memory_order_acquire: 确保当前线程中的后续操作不会在原子操作之前执行。
  • std::memory_order_release: 确保当前线程中的前序操作不会在原子操作之后执行。
  • std::memory_order_seq_cst: 最严格的内存顺序,确保所有线程看到的操作顺序一致。

示例代码解析

在示例代码中,counter是一个std::atomic<int>类型的变量,用于在多线程环境下安全地进行计数操作。increment_counter函数通过fetch_add原子地增加counter的值。std::memory_order_relaxed表示操作可以以任意顺序执行,适用于不需要严格内存顺序的场景。

通过使用std::atomic,可以确保在多线程环境下对counter的操作是线程安全的,避免了数据竞争的问题。

纠错
反馈