C++程序中启动线程的方法
来源:互联网 发布:node mysql query参数 编辑:程序博客网 时间:2024/05/17 02:02
C++11 引入一个全新的线程库,包含启动和管理线程的工具,提供了同步(互斥、锁和原子变量)的方法,我将试图为你介绍这个全新的线程库。
如果你要编译本文中的代码,你至少需要一个支持 C++11 的编译器,我使用的是 GCC 4.6.1,需要使用 -c++0x 或者 -c++11 参数来启用 C++11 的支持。
启动线程
在 C++11 中启动一个线程是非常简单的,你可以使用 std:thread 来创建一个线程实例,创建完会自动启动,只需要给它传递一个要执行函数的指针即可,请看下面这个 Hello world 代码:
#include <thread>
#include <iostream>
void hello(){
std::cout << "Hello from thread " << std::endl;
}
int main(){
std::thread t1(hello);
t1.join();
return 0;
}
所有跟线程相关的方法都在 thread 这个头文件中定义,比较有意思的是我们在上面的代码调用了 join() 函数,其目的是强迫主线程等待线程执行结束后才退出。如果你没写 join() 这行代码,可能执行的结果是打印了 Hello from thread 和一个新行,也可能没有新行。因为主线程可能在线程执行完毕之前就返回了。
线程标识
每个线程都有一个唯一的 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 来定义要执行的代码,因此第一个例子我们可以改写为:
#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 表达式替换函数指针,而结果是一样的。
如果你要编译本文中的代码,你至少需要一个支持 C++11 的编译器,我使用的是 GCC 4.6.1,需要使用 -c++0x 或者 -c++11 参数来启用 C++11 的支持。
启动线程
在 C++11 中启动一个线程是非常简单的,你可以使用 std:thread 来创建一个线程实例,创建完会自动启动,只需要给它传递一个要执行函数的指针即可,请看下面这个 Hello world 代码:
#include <thread>
#include <iostream>
void hello(){
std::cout << "Hello from thread " << std::endl;
}
int main(){
std::thread t1(hello);
t1.join();
return 0;
}
所有跟线程相关的方法都在 thread 这个头文件中定义,比较有意思的是我们在上面的代码调用了 join() 函数,其目的是强迫主线程等待线程执行结束后才退出。如果你没写 join() 这行代码,可能执行的结果是打印了 Hello from thread 和一个新行,也可能没有新行。因为主线程可能在线程执行完毕之前就返回了。
线程标识
每个线程都有一个唯一的 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 来定义要执行的代码,因此第一个例子我们可以改写为:
#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 表达式替换函数指针,而结果是一样的。
阅读全文
0 0
- C++程序中启动线程的方法
- 线程的启动方法
- Java中启动线程start和run方法的区别
- android中 多种启动线程的书写方式及方法
- java方法中启动一个新的线程
- 获取程序启动路径的几种方法(c#)
- C++中调用C程序的方法
- C++中调用C程序的方法
- Java启动线程的方法
- Android启动线程的方法
- 在C#中启动另一个程序的实现方法
- 在应用程序中启动其他程序的方法
- windows中自动启动程序的设置方法
- 第五天 : 启动线程和运行线程中方法的区别
- C#中Join()方法实现线程的顺序执行
- C #中几个线程同步对象的方法
- C #中几个线程同步对象的方法
- 【IO进程】Linux C中回收线程资源的方法
- C#向数据库添加数据遇到问题——报错“‘*’附近有语法错误”
- PHP7革新与性能优化
- 【LeetCode算法练习(C++)】Next Permutation
- C++ Primer 知识点总结 (第二章)
- Error:java: Compilation failed: internal java compiler error
- C++程序中启动线程的方法
- Hyperledger Fabric SDK 示例fabric-samples-《balance-transfer》之九《查询指定的交易信息》
- 关于计算机视觉(ComputerVision, CV)相关领域的网站链接
- vue-router菜鸟进阶!(路由组件传参 vs H5 History模式)
- 前端语言学习网址
- 常见的移动端H5页面开发遇到的坑和解决办法
- MongoDB学习笔记-1
- spring ioc 容器装配bean
- 银行编码规则