C++ 面试题 目录

C++ 中如何创建线程 (std::thread)?

推荐答案

在C++中,可以使用std::thread来创建线程。以下是一个简单的示例代码:

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

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

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

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

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

    ------ --
-

在这个示例中,std::thread t(threadFunction);创建了一个新的线程t,并开始执行threadFunctiont.join();确保主线程等待t线程执行完毕后再继续执行。

本题详细解读

1. std::thread的基本用法

std::thread是C++11引入的标准库类,用于创建和管理线程。要创建一个线程,只需将可调用对象(如函数、lambda表达式、函数对象等)传递给std::thread的构造函数。

其中callable可以是函数、lambda表达式或函数对象。

2. 线程的启动与执行

std::thread对象被创建时,线程会立即开始执行传递给它的可调用对象。在上面的示例中,threadFunction会在新线程中执行。

3. 线程的同步

join()函数用于阻塞当前线程,直到被调用的线程执行完毕。在上面的示例中,t.join();确保主线程等待t线程执行完毕后再继续执行。

如果不调用join()detach(),程序在std::thread对象销毁时会调用std::terminate,导致程序异常终止。

4. 线程的分离

如果你不希望主线程等待子线程执行完毕,可以调用detach()函数。分离后的线程会在后台运行,主线程不会等待它。

5. 线程的异常处理

在多线程编程中,异常处理需要特别注意。如果线程函数抛出异常且未被捕获,程序会调用std::terminate。因此,建议在线程函数内部捕获并处理异常。

6. 线程的参数传递

std::thread的构造函数可以接受额外的参数,这些参数会传递给线程函数。

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

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

在这个示例中,42"Hello"会作为参数传递给threadFunctionWithArgs

7. 线程的移动语义

std::thread对象是不可复制的,但可以通过移动语义将线程的所有权从一个std::thread对象转移到另一个。

8. 线程的ID

每个线程都有一个唯一的ID,可以通过std::thread::get_id()获取。

9. 线程的硬件并发

std::thread::hardware_concurrency()返回当前系统支持的并发线程数,通常与CPU的核心数相关。

10. 线程的注意事项

  • 确保线程函数是线程安全的,避免数据竞争。
  • 使用join()detach()来管理线程的生命周期。
  • 在多线程环境中,谨慎使用全局变量和静态变量。
纠错
反馈