C++ std::thread

博客介绍了在C++中使用线程类的相关内容。使用线程类需包含头文件,线程对象不可复制或赋值但可移动。构造线程对象时,要给构造函数输入可调用单元,如函数、函数对象或Lambda表达式,其返回值一般被忽略,还给出了Hello World代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

若要使用线程类std::thread,则需包含<thread>头文件。

创建线程

std::thread表示一个线程。线程对象是不可复制或赋值的,但可以移动(move),如移动构造或移动赋值。

当构造std::thread对象时,需给构造函数输入一个参数,该参数是一个可调用的单元,它可以是函数,函数对象,或Lambda表达式。可调用单元的返回值一般会被忽略。

以下是一个Hello World代码示例:

// ThreadHelloWorld.cpp

#include <iostream>
#include <thread>

void PrintHelloWorld()
{
    std::cout << "Hello World!\n";
}

int main(int argc, char** argv)
{
    std::thread helloWorldThread(PrintHelloWorld);
    helloWorldThread.join();

    return 0;
}
### C++ 中 `std::thread` 的使用方法 #### 创建线程 为了创建一个新的线程,可以实例化一个 `std::thread` 对象并传递给其构造函数想要在线程中运行的任务。这个任务通常是一个函数或 lambda 表达式。 ```cpp #include <iostream> #include <thread> void backgroundTask() { std::cout << "Running on a separate thread." << std::endl; } int main() { std::thread t(backgroundTask); } ``` 当不再需要线程时,应该调用 `join()` 或者 `detach()` 方法来释放资源[^1]。 #### 加入线程 (`join`) 通过调用 `join()` 可以等待线程完成工作后再继续执行后续代码: ```cpp t.join(); // 主线程在此处暂停直到子线程结束 ``` #### 分离线程 (`detach`) 分离线程意味着让新启动的线程独立于主线程之外运行,而不需要显式的同步机制: ```cpp t.detach(); // 子线程将继续异步执行直至完成自己的生命周期 ``` #### 获取线程ID 可以通过 `get_id()` 函数获得当前线程的身份标识符: ```cpp auto id = t.get_id(); std::cout << "Thread ID is " << id << std::endl; ``` #### 检测是否可加入 要判断某个线程对象关联的实际操作系统级别的线程是否存在且未被回收,则可以用 `joinable()` 成员函数来进行测试: ```cpp if (t.joinable()) { // 如果该条件成立则表示存在有效的工作线程可供连接 } ``` #### Lambda表达式作为参数传入 也可以利用lambda表达式向线程传递额外的数据,在下面的例子中展示了如何捕获局部变量以及外部作用域内的数据结构: ```cpp #include <iostream> #include <string> #include <thread> int main(){ int local_state=0; auto func=[&local_state]() mutable -> void{ ++local_state; std::cout<<"Local state:"<<local_state<<'\n'; }; std::thread(func).join(); } ``` #### 处理返回值 对于那些有返回值得情况,我们可以借助 `std::promise`, `std::future` 和 `std::packaged_task` 来实现跨线程间的安全通信与协调: ```cpp #include <iostream> #include <memory> #include <future> #include <utility> #include <functional> using namespace std; double divide(double a,double b){ if(b==0) throw runtime_error("Division by zero!"); return a/b; } int main(){ packaged_task<double(double,double)> task(divide); future<double> result=task.get_future(); thread td(move(task),2.0,4.0); try{ cout<<result.get()<<endl;//阻塞在这里直到得到结果 } catch(exception const&e){ cerr<<e.what()<<endl; } td.join(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值