C++11多线程学习记录(二)

1. 基本线程管理

所有的C++程序都至少包含一个线程(main函数所在的C++运行时线程),程序在启动主线程之后可以创建其他的线程,这些线程使用它们的初始化函数作为程序的起点(如(一)中的void hello函数),当创建线程之后我们需要启动创建的这些新的线程。

2. 线程的启动

C++线程启动的方式需要使用std::thread类来进行,大致方式如下:
使用一个函数(具体来说是可调用对象)来初始化std::thread线程对象
std::thread定义在头文件<thread>之中

void Foo();
std::thread myThread(Foo());

除了这种最常用的方式之外还有其他几种方法来初始化std::thread

  1. 使用仿函数来实现:
class Task {
public:
    void operator() const {
        foobar();
    }
};

Task t;
std::thread myThread(t);

在使用这种方式的时候需要防止产生C++中所谓的“Most vexing parse”错误,具体来说是以下一种错误:

当我们声明:std::thread myThread(Task());

我们期望的结果是:定义一个std::thread类型的变量myThread,它使用类Task变量来初始化。

实际的结果是:声明了一个函数,函数名是myThread,返回值是std::thread,形参是一个函数指针(返回值是Task对象,形参是空)

解决方式:(1)使用C++11中的初始化语法:std::thread myThread{Task()};
(2) 使用额外的一对括号:std::thread myThread ((Task()));

2. 使用C++11中的lambda表达式

std::thread myThread([](){foobar();});

3. 线程所有权的转移

std::thread线程支持所谓的“移动语义”,因此可以将std::thread进行移动,这种感觉好像是在“转移std::thread所对应的资源”,例如:

void foo();
void bar();
std::thread t1(foo);
std::thread t2 = std::move(t1) //将t1转移到t2
t1 = std::thread(bar);

这样的移动方式也可以在函数返回值中体现,也就是我们可以写出如下的代码:

std::thread f() {
    void doSomething();
    return std::thread(doSomething);
}

std::thread g() {
    void doSomething(int);
    std::thread t(doSomething, 3);
    return t;
}

std::thread支持移动,可以让线程对象存储在std::vector之中,c++11中对std::vector进行了改动,它可以存储支持“移动语义”的对象。下面的程序演示了创建若干个线程,并等待它们运行结束:

void doWork(unsigned id);

void f() {
    std::vector<std::thread> threads;
    for (unsigned i = 0; i < 20; ++i) {
        threads.push_back(std::thread(doWork(i)); //创建多个线程对象
    }
    std::for_each(threads.begin(), threads.end(),
                    std::mem_fn(&std::thread::join)); //调用它们的join方法
    }

4. 线程ID

线程ID是一个std::thread::id类型的变量,可以通过get_id获取ID值。如果一个线程对象没有一个与之关联正在执行的线程,那么get_id返回一个std::thread::id默认值对象,表示没有任何线程。另一种方式是使用std::this_thread::get_id来获取当前线程的ID。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值