std::thread


1. 参数传递

在C++中,std::thread是用来创建线程的。当我们需要向新线程中的函数传递参数时,可以通过多种方式来实现。

  1. 通过传递参数给函数。
#include <thread>
#include <iostream>
 
void func(int a, int b) {
    std::cout << "The sum is: " << a + b << std::endl;
}
 
int main() {
    int x = 10;
    int y = 20;
    std::thread t1(func, x, y); // 通过直接传递参数
    t1.join();
    return 0;
}
  1. 通过std::ref将参数作为引用传递。
#include <thread>
#include <iostream>
 
void func(int& a) {
    a = a + 10;
}
 
int main() {
    int x = 10;
    std::thread t1(func, std::ref(x)); // 通过std::ref将参数作为引用传递
    t1.join();
    std::cout << x << std::endl; // 输出将会是20
    return 0;
}

3.通过lambda表达式传递参数。

#include <thread>
#include <iostream>
 
int main() {
    int x = 10;
    std::thread t1([x]() {
        std::cout << x << std::endl;
    }); // 通过lambda表达式传递参数
    t1.join();
    return 0;
}
  1. 通过std::bind将参数绑定到函数上。
#include <thread>
#include <iostream>
#include <functional>
 
void func(int a, int b) {
    std::cout << "The sum is: " << a + b << std::endl;
}
 
int main() {
    int x = 10;
    int y = 20;
    std::thread t1(std::bind(func, x, y)); // 通过std::bind将参数绑定到函数上
    t1.join();
    return 0;
}

2. 线程异常

线程异常退出:如果一个线程因为未捕获的异常或其他非致命错误而退出,通常不会导致整个进程崩溃。其他线程会继续运行,进程仍然保持活动状态。

线程执行致命错误

  • 非法内存访问:如果线程执行了非法内存访问),可能会触发段错误(Segmentation Fault),操作系统会终止包含该线程的整个进程。
  • 除零错误:如果线程试图执行除以零的操作,也可能导致整个进程崩溃。
  • 堆栈溢出:如果线程发生堆栈溢出,导致整个进程崩溃,因为堆栈溢出会破坏内存布局,影响进程的稳定性。
  • 线程对共享资源的破坏:如果一个线程在操作共享资源时出错(如破坏了进程的全局状态、内存数据结构等),可能导致整个进程的状态变得不可预测,最终导致进程崩溃。
  • 主线程崩溃:如果是主线程崩溃,整个进程通常会立即终止,因为主线程的生命周期通常与进程的生命周期紧密绑定。

3. 线程池

https://blog.youkuaiyun.com/qq_34799070/article/details/108404953?fromshare=blogdetail&sharetype=blogdetail&sharerId=108404953&sharerefer=PC&sharesource=qq_34799070&sharefrom=from_link

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值