c++11 std::thread使用注意事项

用std::thread创建线程object时,有以下要注意的地方:
1.如果参数有隐式转换,这个转换是在新的线程context下进行的
比如:

void f(int i,std::string const& s);
char a[] = "hello";
std::thread t(f,3,a);

这种情况下,新线程调用 f 函数时,参数是char const ,因为std::thread构造函数模板形成的参数是char const
如果线程在为函数参数作转换前,std::thread t(f,3,a) 语句所在函数退出,那么这个参数就是个dangling pointer,野指针了。
可以用std::string(a)这样的参数避免。

2.如果参数是引用,那么实际上也是复制。其缘由也是模板作怪。
可以用std::ref来实现引用。

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、付费专栏及课程。

余额充值