c++11多线程

本文详细介绍了C++11的多线程特性,包括线程创建、线程基本用法、互斥量、条件变量和异步操作。讲解了如何使用std::thread创建线程,获取线程ID,利用std::mutex保护共享数据,条件变量的使用以及同步队列的实现。此外,还讨论了信号丢失和虚假唤醒问题的解决方法,并演示了std::future、std::promise和std::package_task在异步操作中的应用。
摘要由CSDN通过智能技术生成

线程创建

           使用std::thread创建线程,只需要提供函数或者仿函数即可,std::thread使用了可变参数模板,可以传递任意个参数函数参数,但是函数的返回值会被忽略
           示例:

#include <iostream>
#include <thread>
class A
{
   
    int m_a;
};
int test(A param)
{
   
   return 0;
}
int main()
{
   
    //创建线程,并向test函数传递参数
    std::thread thread1(test,A());
    //使用lambda表达式作为线程执行函数
    std::thread thread2([](int tmp)
                        {
    printf("lambda\n"); },
                        10);
    //使用std::function作为线程执行函数
    std::thread thread3(std::bind(&test,A()));
    thread1.join();
    return 0;
}

          注意事项:使用这种方式创建线程非常方便,但std::thread变量出了作用域会被析构,若此时线程还未执行完将产生错误,在使用时注意控制好std::thread变量的生命周期。

          std::thread不能复制,只能移动类似于std::unique_ptr,所以我们可以先创建线程,再将其移动到其他容器中
          示例:

#include <iostream>
#include <thread>
#include <list>
#include <functional>
class A
{
   
    int m_a;
};
std::list<std::thread> L;
void func()
{
   
    for (int i = 1; i <= 10; i++)
    {
   
        std::thread t([](A param)
        {
   
           printf("lambda\n");
        },A());

        L.push_back(std::move(t));
    }
}
int main()
{
    
    func();
    for(auto &it : L)
    {
   
        it.join();
    }

    return 0;
}

线程基本用法

           1.获取线程ID

int main()
{
    
    std::thread t(func);
    //获取线程id
    t.get_id();

    return 0;
}

          2.获取CPU核心数,我们可以根据CPU核心数来设置线程池中的线程数

int main()
{
    
    std::cout << std::thread::hardware_concurrency();

    return 0;
}

         3.线程休眠,我们可以使用std::this_thread::sleep_for()让线程休眠,从而替代操作系统原生的sleep,方便跨平台

int main()
{
    
    //使主线程休眠3s
    std::this_thread::sleep_for(std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值