[5 使用C++11让多线程开发变得简单] 5.1 线程

std::thread创建线程很简单,只需提供线程函数或函数对象,同时指定线程函数的参数。

创建线程示例:

#include <thread>

void func()
{

}

int main()
{
    std::thread t(func);
    t.join();

    return 0;
}

join函数会阻塞主线程,直到子线程执行结束。

如果不希望主线程被阻塞,可用detach()方法,将主线程和子线程分离。

#include <thread>

void func()
{

}

int main()
{
    std::thread t(func);
    t.detach();

    return 0;
}

子线程和主线程分离,让子线程作为后台线程运行了,detach后子线程不再受主线程控制。

线程可以接受参数:

void func(int i, double d, const std::string& s)
{
    std::cout << i << ", " << d << ", " << s << std::endl;
}

int main()
{
    std::thread t(func, 1, 2, "test");
    t.join();
    
    return 0;
}

输出:
1, 2, test

线程不能复制,但可以移动:

#include <thread>

void func()
{

}

int main()
{
    std::thread t(func);
    std::thread t1(std::move(t));
    t.join();
    t1.join();

    return 0;
}

还可以通过std::bind或lambda表达式来创建线程:

void func(int a, double b)
{

}

int main()
{
    std::thread t1(std::bind(func, 1, 2));
    std::thread t2([](int a, double b){}, 1,2);
    t1.join();
    t2.join();

    return 0;
}

需要注意线程对象的生命周期:

#include <thread>

void func()
{

}

int main()
{
    std::thread t(func);

    return 0;
}

上面代码可能抛出异常,如果线程对象t先于线程函数析构了,则会异常。可通过join方式阻塞或detach方式后台运行来解决。

获取线程当前信息,如线程ID,CPU数量;和线程休眠:

void f()
{
    std::this_thread::sleep_for(std::chrono::seconds(3));
    cout << "time out" << endl;
}

int main()
{
    std::thread t(f);
    t.join();
    cout << t.get_id() << endl;
    cout << std::thread::hardware_concurrency() << endl;

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值