码迷,mamicode.com
首页 > 其他好文 > 详细

std::thread(2)

时间:2014-05-10 19:36:43      阅读:281      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   color   

bubuko.com,布布扣
个线程都有一个唯一的 ID 以识别不同的线程,std:thread 类有一个 get_id() 方法返回对应线程的唯一编号,你可以通过 std::this_thread 来访问当前线程实例,下面的例子演示如何使用这个 id:
#include <thread>
#include <iostream>
#include <vector>
 
void hello(){
    std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
}
 
int main(){
    std::vector<std::thread> threads;
 
    for(int i = 0; i < 5; ++i){
        threads.push_back(std::thread(hello));
    }
 
    for(auto& thread : threads){
        thread.join();
    }
 
    return 0;
}
依次启动每个线程,然后把它们保存到一个 vector 容器中,程序执行结果是不可预测的,例如:

Hello from thread 140276650997504
Hello from thread 140276667782912
Hello from thread 140276659390208
Hello from thread 140276642604800
Hello from thread 140276676175616

也可能是:

Hello from thread Hello from thread Hello from thread 139810974787328Hello from thread 139810983180032Hello from thread
139810966394624
139810991572736
139810958001920

或者其他结果,因为多个线程的执行是交错的。你完全没有办法去控制线程的执行顺序(否则那还要线程干吗?)
使用 lambda 启动线程
当线程要执行的代码就一点点,你没必要专门为之创建一个函数,你可以使用 lambda 来定义要执行的代码,因此第一个例子我们可以改写为:
#include <thread>
#include <iostream>
#include <vector>
 
int main(){
    std::vector<std::thread> threads;
 
    for(int i = 0; i < 5; ++i){
        threads.push_back(std::thread([](){
            std::cout << "Hello from thread " << std::this_thread::get_id() << std::endl;
        }));
    }
 
    for(auto& thread : threads){
        thread.join();
    }
 
    return 0;
}
在这里我们使用了一个 lambda 表达式替换函数指针,而结果是一样的。
bubuko.com,布布扣

 

std::thread(2),布布扣,bubuko.com

std::thread(2)

标签:style   blog   class   code   java   color   

原文地址:http://www.cnblogs.com/zzyoucan/p/3704135.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!