【C++】线程库

本文介绍了进程作为资源调度的最小单位,线程作为运算调度的最小单位。通过C++的std::thread库展示了如何创建和管理线程。线程状态包括创建、就绪、执行等,每个线程拥有独立的栈空间。同步和异步的概念被阐述,同步函数会阻塞当前线程,而异步则不会。文章还提到了线程安全问题,如不共享数据、线程函数无返回值以及避免函数重载混淆。最后,讨论了线程的join和detach方法,以及硬件并发能力的检测。

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

进程和线程

进程是资源调度的最小单位

线程是操作系统能够进行运算调度的最小单位


头文件:#include<thread>

void func()
{
    cout << "func" << endl;
}
int main()
{
    std::thread tha(func);//创建一个线程
    
    tha.join();//等待线程结束
}

线程的状态:

创建-->就绪-->执行-->io阻塞-->就绪-->...

每个线程对应一个线程结构+内核栈(10M),可能在执行过程中被其他线程打乱。


同步&异步

同步:任务在执行时必须按照一定的顺序进行,当前任务执行完成之后才能执行下一个任务。

异步:任务在执行时不需要按照固定的顺序进行,可以同时执行多个任务,每个任务的执行结果也不一定按照执行顺序返回。

在编程中,同步和异步通常指的是函数调用的方式。同步函数调用会阻塞当前线程直到函数执行完成并返回结果,而异步函数调用则不会阻塞当前线程,而是在后台启动一个任务去执行函数,并在函数执行完成后再通知主线程获取结果。常见的异步编程方式有回调函数、Promise、async/await等。

注意

两个线程不共享数据,x、y分别有两份,在线程对应的内核栈中

void func()
{
    int x = 10;
    int y = 20;
}
int main()
{
    cout << "main begin" << endl;
    std::thread tha(func);
    std::thread thb(func);
    tha.join();
    thb.join();
    cout << "main end" << endl;
}

thread(func,'a');//func是创建线程的函数,a是func中需要的参数

输出顺序不一定:暂时存在缓存中

线程函数不要有返回值!!!无法获取线程函数的返回值

函数重载时放入线程中无法区分:error

void fun(){}
void fun(int a){}
void fun(int a,char*p){}
int main()
{
    char c = 'ch';
    int a = 10;
    thread::tha(fun);
    thread::thb(fun,a);
    thread::thc(fun,&c);
}

不能用拷贝构造或赋值=,可以用移动构造和移动赋值;

一些方法

线程函数的形参若为引用需要加上ref

void funa(int&p,int a){}
int main()
{
    int p = 100;
    thread tha(funa,std::ref(p),10);
}

hardware_concurrency:返回逻辑内核数量

join:等待线程执行完毕,关联线程与当前进程,释放资源

detach分离:把线程从当前进程剥离出去,进程执行完毕线程就没有机会执行了

std::this_thread::sleep_for(std::chrono::milliseconds(10)):线程的执行停止指定的时间段

std::this_thread::sleep_until():线程的执行停止到指定的时间点

get_id:返回线程的id号

joinable:检查现有的线程是1否0结束

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

曦樂~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值