C++之std::thread线程

本文介绍了C++11中的std::thread线程库的使用,包括如何创建线程、线程的不同调用方式(join和detach),以及注意事项,特别是关于作用域和数据传递的问题。
摘要由CSDN通过智能技术生成

std::thread是C++11线程库提供的线程创建。参数绑定的是线程需要调用的函数与参数。

1、如何创建

std::thread th;//空的,

std::thread th1([]() {

        //匿名函数,

        //执行线程代码

        });

void thFun(int k);

std::thread th(thFun,10);// thFun为线程需要调用的函数,10为thFun函数的参数。

2、线程的调用方式

join();//会阻塞当前代码,等待线程完成退出后,才会继续向下执行;

detach();

当前代码继续向下执行,创建的新线程同时并发执行,这时候需要特别注意:创建的新线程对当前作用域的变量的使用,创建新线程的作用域结束后,有可能线程仍然在执行,这时局部变量随着作用域的完成都已销毁,如果线程继续使用局部变量的引用或者指针,会出现意想不到的错误,并且这种错误很难排查

注意:一定在线程销毁前调用线程的调用方式。如果不使用,会异常。

使用detach分离调用的时候一定注意参数,因为存在作用域问题,不要使用当前作用域的数据传参。

例子:

#include <iostream>

#include"dongtest.h"

#include <thread>

#include <chrono> 

using namespace std;

void thFun(int k)

{

    for (int i=0;i<k;i++)

    {

        cout << i<<endl;

        std::this_thread::sleep_for(std::chrono::milliseconds(100));

    }

  

}

int main()

{

 

    std::thread th1([]() {

        //匿名函数,

        //执行线程代码

        });

    std::thread th(thFun,10);

    th.detach();

    //th.join();

    cout << "detach" << endl;

    while (1);

    return 0;

}

C++中,std::thread是用于创建和管理线程的类。以下是std::thread的基本用法: 1. 包含头文件:为了使用std::thread,需要包含头文件<thread>。 2. 创建线程:使用std::thread的构造函数创建线程对象,并将函数指针或可调用对象作为参数传递给构造函数。例如: ```cpp void myFunction() { // 线程执行的代码 } std::thread myThread(myFunction); // 创建一个新线程,执行myFunction ``` 3. 启动线程:通过调用线程对象的成员函数`std::thread::join()`来启动线程。例如: ```cpp myThread.join(); // 启动线程执行 ``` 4. 传递参数:如果需要向线程传递参数,可以在创建线程时将参数作为额外的参数传递给构造函数。例如: ```cpp void myFunction(int arg1, std::string arg2) { // 使用传递的参数执行操作 } std::thread myThread(myFunction, 42, "Hello"); // 创建线程并传递参数 ``` 5. 分离线程:通过调用线程对象的成员函数`std::thread::detach()`可以将线程分离,使其在后台运行而不需要等待。例如: ```cpp myThread.detach(); // 分离线程,使其在后台运行 ``` 6. 获取线程ID:可以通过`std::thread::get_id()`成员函数获取线程的唯一标识符。例如: ```cpp std::thread::id threadId = myThread.get_id(); // 获取线程的ID ``` 7. 线程同步:在线程间进行同步操作时,可以使用互斥锁(std::mutex)和条件变量std::condition_variable)等同步原语来确保线程安全。 注意事项: 线程的生命周期应与其所执行的函数的生命周期相匹配,以避免悬挂引用或访问已销毁的对象。 - 分离线程后,不能再对其进行join()操作,也无法获取其状态或等待其完成。 这是std::thread的基本用法,您可以根据实际需求进一步了解和使用其他相关函数和特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值