c++11 语言级线程
c++11 语言级线程
线程的创建
用std::thread创建线程非常简单,只需要提供线程函数或函数对象即可,并且可以同时指定线程函数的参数。
#define _CRT_SECURE_NO_WARNINGS #include <iostream>
#include <string>
#include <chrono>
#include <thread> void func1()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds());
std::cout << __FUNCTION__ << std::endl;
}
} void func2()
{
while (true)
{
std::this_thread::sleep_for(std::chrono::milliseconds());
std::cout << __FUNCTION__ << std::endl;
}
} void func3(int a, char ch, const char *str)
{
std::this_thread::sleep_for(std::chrono::milliseconds());
std::cout << "a = " << a << std::endl;
std::cout << "ch = " << ch << std::endl;
std::cout << "str = " << str << std::endl;
} void mytest()
{
std::thread t1(func1); // 子线程1
std::thread t2(func2); // 子线程2 // 线程还可以接收函数的参数
std::thread t3(func3, , 'a', "xyz"); //子线程3
std::thread t4(func3, , 'a', "abc"); //子线程3 while(true) // 主线程
{
std::this_thread::sleep_for(std::chrono::milliseconds());
std::cout << __FUNCTION__ << std::endl;
} return;
} int main()
{
mytest(); system("pause");
return ;
}
回收线程资源
std::thread::join等待线程结束(此函数会阻塞),并回收线程资源,如果线程函数有返回值,返回值将被忽略。
#define _CRT_SECURE_NO_WARNINGS #include <iostream>
#include <string>
#include <chrono>
#include <thread> void puase_thread(int no, int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread-" << no << " pause of " << n << " seconds" << std::endl;
} void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, , );
std::thread t2(puase_thread, , );
std::thread t3(puase_thread, , ); std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
t1.joinable() ? t1.join() : std::cout << "Thread ID-" << t1.get_id() << " can not join" << std::endl;
t2.joinable() ? t2.join() : std::cout << "Thread ID-" << t2.get_id() << " can not join" << std::endl;
t3.joinable() ? t3.join() : std::cout << "Thread ID-" << t3.get_id() << " can not join" << std::endl;
std::cout << "All threads joined!" << std::endl; return;
} int main()
{
mytest(); system("pause");
return ;
}
如果不希望线程被阻塞执行,可以调用线程的std::thread::detach(此函数不会阻塞),将线程和线程对象分离,让线程作为后台线程去执行。
但需要注意的是,detach之后就无法在和线程发生联系了,比如detach之后就不能再通过join来等待执行完,线程何时执行完我们也无法控制。
#define _CRT_SECURE_NO_WARNINGS #include <iostream>
#include <string>
#include <chrono>
#include <thread> void puase_thread(int no, int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
std::cout << "thread-" << no << " pause of " << n << " seconds" << std::endl;
} void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, , );
std::thread t2(puase_thread, , );
std::thread t3(puase_thread, , ); std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
t1.joinable() ? t1.detach() : std::cout << "Thread ID-" << t1.get_id() << " can not detach" << std::endl;
t2.joinable() ? t2.detach() : std::cout << "Thread ID-" << t2.get_id() << " can not detach" << std::endl;
t3.joinable() ? t3.detach() : std::cout << "Thread ID-" << t3.get_id() << " can not detach" << std::endl;
std::cout << "All threads joined!" << std::endl; return;
} int main()
{
mytest(); system("pause");
return ;
}
获取线程ID和CPU核心数
#define _CRT_SECURE_NO_WARNINGS #include <iostream>
#include <string>
#include <chrono>
#include <thread> void puase_thread(int n)
{
std::this_thread::sleep_for(std::chrono::seconds(n));
// std::this_thread::get_id() 获取线程ID
std::cout << "thread-" << std::this_thread::get_id() << " pause of " << n << " seconds" << std::endl;
} void mytest()
{
//std::cout << "Spawning 3 threads..." << std::endl;
std::thread t1(puase_thread, );
std::thread t2(puase_thread, );
std::thread t3(puase_thread, ); std::cout << "main id: " << std::this_thread::get_id() << std::endl; // 主线程id
std::cout << "cpu num: " << std::thread::hardware_concurrency() << std::endl; // 获取cpu核心数,失败返回0 std::cout << "Done spawning threads. Now waiting for them to join:" << std::endl;
// t1.get_id() // 获取t1此线程的ID
t1.joinable() ? t1.detach() : std::cout << "Thread ID-" << t1.get_id() << " can not detach" << std::endl;
t2.joinable() ? t2.join() : std::cout << "Thread ID-" << t2.get_id() << " can not join" << std::endl;
t3.joinable() ? t3.join() : std::cout << "Thread ID-" << t3.get_id() << " can not join" << std::endl;
std::cout << "All threads joined!" << std::endl; return;
} int main()
{
mytest(); system("pause");
return ;
}
c++11 语言级线程的更多相关文章
- linux0.11内核源码——用户级线程及内核级线程
参考资料:哈工大操作系统mooc 用户级线程 1.每个进程执行时会有一套自己的内存映射表,即我们所谓的资源,当执行多进程时切换要切换这套内存映射表,即所谓的资源切换 2.但是如果在这个进程中创建线程, ...
- 使用strace查看C语言级别的php源码
XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...
- [No00003A]操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads
开始核心级线程 内核级线程对多核的支持怎么样? 和用户级相比,核心级线程有什么不同? ThreadCreate 是系统调用,内核管理TCB ,内核负责切换线程 如何让切换成型? − − 内核栈,TCB ...
- {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器
Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...
- 操作系统学习笔记5 | 用户级线程 && 内核级线程
在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...
- C++11的简单线程池代码阅读
这是一个简单的C++11实现的线程池,代码很简单. 原理就是管理一个任务队列和一个工作线程队列. 工作线程不断的从任务队列取任务,然后执行.如果没有任务就等待新任务的到来.添加新任务的时候先添加到任务 ...
- [No000039]操作系统Operating Systems用户级线程User Threads
多进程是操作系统的基本图像 是否可以资源不动而切换指令序列? 进程 = 资源 + 指令执行序列 线程: 保留了并发的优点,避免了进程切换代价 实质就是映射表不变而PC 指针变 多个执行序列+ 一个地址 ...
- Linux线程的实现 & LinuxThread vs. NPTL & 用户级内核级线程 & 线程与信号处理
另,线程的资源占用可见:http://www.cnblogs.com/charlesblc/p/6242111.html 进程 & 线程的很多知识可以看这里:http://www.cnblog ...
- 第11章 Windows线程池(3)_私有的线程池
11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...
随机推荐
- linux增加硬盘 磁盘分区格式化及挂载
nux磁盘分区格式化及挂载 意义: 给linux 系统服务器扩容, 加一块硬盘 实验环境: virtualBox虚拟软件 + centos6.5 第一步: 添加硬件 硬盘 (我这里用virtualB ...
- 搭建OpenSTF+Jenkins持续集成环境的协同开发
最近在研究如何将OpenSTF与Jenkins进行协同开发,刚刚爬梯子看了些资料,赶紧记录下来. 转载请注明出处:https://www.cnblogs.com/v88v/p/10405338.htm ...
- 【Apache】 ab进行压力测试
前言: ab是apache自带的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab然后进行apache 负载压力测试. 工具: Apache ab压测工具 一.安装 (1) 下载 : ...
- 统计学习方法c++实现之七 提升方法--AdaBoost
提升方法--AdaBoost 前言 AdaBoost是最经典的提升方法,所谓的提升方法就是一系列弱分类器(分类效果只比随机预测好一点)经过组合提升最后的预测效果.而AdaBoost提升方法是在每次训练 ...
- 0.0 配置JAVA环境和Maven环境(W10注意点)
今天上班第一天,真有些忘了之前配置的环境问题,全新的电脑开始配置. 电脑软件JDK以及eclipse都是下载最新的 添加最全的链接吧: 1.JDK配置链接:http://www.cnblogs.com ...
- Python3中的函数 大全
Python 函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.Python提供了许多内建函数,比如print().但也可以自己创建 ...
- Homebrew -- 安装与使用
使用 React Native,必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 推荐使用Homebrew来安装 Node 和 Watchman ...
- 第35次Scrum会议(11/23)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文小组照片 二.开会信息 时间:2017/11/23 17:03~17:24,总计21min.地点:东北师 ...
- 【每日scrum】第一次冲刺day5
请教以前做过类似软件的同学,受益匪浅,启发自己
- JAVA对象的初始化过程
出处:http://blog.csdn.net/andrew323/article/details/4665379 下面我们通过两个例题来说明对象的实例化过程. 例1: 编译并运行该程序会有以下输 ...