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 语言级线程的更多相关文章

  1. linux0.11内核源码——用户级线程及内核级线程

    参考资料:哈工大操作系统mooc 用户级线程 1.每个进程执行时会有一套自己的内存映射表,即我们所谓的资源,当执行多进程时切换要切换这套内存映射表,即所谓的资源切换 2.但是如果在这个进程中创建线程, ...

  2. 使用strace查看C语言级别的php源码

    XCACHE XCache 是一个开源的 opcode 缓存器/优化器, 这意味着他能够提高您服务器上的 PHP 性能. 他通过把编译 PHP 后的数据缓冲到共享内存从而避免重复的编译过程, 能够直接 ...

  3. [No00003A]操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

    开始核心级线程 内核级线程对多核的支持怎么样? 和用户级相比,核心级线程有什么不同? ThreadCreate 是系统调用,内核管理TCB ,内核负责切换线程 如何让切换成型? − − 内核栈,TCB ...

  4. {Python之线程} 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Threading模块 九 锁 十 信号量 十一 事件Event 十二 条件Condition(了解) 十三 定时器

    Python之线程 线程 本节目录 一 背景知识 二 线程与进程的关系 三 线程的特点 四 线程的实际应用场景 五 内存中的线程 六 用户级线程和内核级线程(了解) 七 python与线程 八 Thr ...

  5. 操作系统学习笔记5 | 用户级线程 && 内核级线程

    在上一部分中,我们了解到操作系统实现多进程图像需要组织.切换.考虑进程之间的影响,组织就是用PCB的队列实现,用到了一些简单的数据结构知识.而本部分重点就是进程之间的切换. 参考资料: 课程:哈工大操 ...

  6. C++11的简单线程池代码阅读

    这是一个简单的C++11实现的线程池,代码很简单. 原理就是管理一个任务队列和一个工作线程队列. 工作线程不断的从任务队列取任务,然后执行.如果没有任务就等待新任务的到来.添加新任务的时候先添加到任务 ...

  7. [No000039]操作系统Operating Systems用户级线程User Threads

    多进程是操作系统的基本图像 是否可以资源不动而切换指令序列? 进程 = 资源 + 指令执行序列 线程: 保留了并发的优点,避免了进程切换代价 实质就是映射表不变而PC 指针变 多个执行序列+ 一个地址 ...

  8. Linux线程的实现 & LinuxThread vs. NPTL & 用户级内核级线程 & 线程与信号处理

    另,线程的资源占用可见:http://www.cnblogs.com/charlesblc/p/6242111.html 进程 & 线程的很多知识可以看这里:http://www.cnblog ...

  9. 第11章 Windows线程池(3)_私有的线程池

    11.3 私有的线程池 11.3.1 创建和销毁私有的线程池 (1)进程默认线程池 当调用CreateThreadpoolwork.CreateThreadpoolTimer.CreateThread ...

随机推荐

  1. 如何写一个Xss Bot

    如何写一个Xss Bot 现在的ctf比赛里 xss的出题方式比较特殊,一般使用xss bot,所以借鉴大佬经验尝试弄一个xss题目. xss bot 就是代替管理员去完成点击页面的任务,bot需要能 ...

  2. php常用的魔术方法

    __construct:构造函数,一旦创建对象都就会自动调用 __call:当调用了未定义的方法时会自动触发 __set:当给类外部不可访问的属性设置值时会自动触发 __get:当获取类外部不可访问的 ...

  3. python通讯录系统

    ---恢复内容开始--- 对于一般的通讯录系统,主要有两个参数:姓名和电话号码,所以可以利用python编程里面的字典来进行建立之间的所属关系, 可以利用以下代码简单实现: print('|--- 欢 ...

  4. FFmpeg+vs2013开发环境配置(windows)

    1.下载ffmpeg包(dll.include.lib)   https://ffmpeg.zeranoe.com/builds/         有3个版本:Static.Shared和Dev St ...

  5. js数组的比较

    如果两个数组元素个数都相等,但排序不同,那么它两个相等吗?结果肯定是否定的.但如果先调用sort()方法进行排序,结果就是true了. console.log(a.sort().toString()= ...

  6. Netty源码分析第8章(高性能工具类FastThreadLocal和Recycler)---->第1节: FastThreadLocal的使用和创建

    Netty源码分析第八章: 高性能工具类FastThreadLocal和Recycler 概述: FastThreadLocal我们在剖析堆外内存分配的时候简单介绍过, 它类似于JDK的ThreadL ...

  7. Windows Server平台 confluence6.7.1安装与破解

    1.1硬件需求建议: CPU:32/64 bit 2.27GHz双核心以上之CPU: 内存:8GB以上: 硬盘:300GB,7200转以上: 建议数据库.Confluence等各自独立一台服务器. 1 ...

  8. RBC:Echo设备2020年可为亚马逊贡献100亿美元收入

    BI 中文站 12 月 22 日报道 加拿大皇家银行资本市场(RBC Capital Markets)分析师马克-马哈尼(Mark Mahaney)表示,亚马逊是首批将智能音箱引进主流受众的公司之一, ...

  9. Nginx中server_name 参数详解

    Nginx中的server_name指令主要用于配置基于名称的虚拟主机,server_name指令在接到请求后的匹配顺序分别为: 1.准确的server_name匹配,例如: server { lis ...

  10. 20162328蔡文琛 2017week03

    20162328 2017-2018-1 <程序设计与数据结构>第3周学习总结 教材学习内容总结 查找是在一组项内找到指定目标或是确定目标不存在的过程. 搞笑的查找使得比较的次数最少. C ...