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. linux 查询管道过滤,带上标题字段

    linux查询过滤, 带上标题字段例: 一个简单的查询 ps -e | grep httpd 上面经过grep 过滤后, 标题没了, 但是为了看上去更方便,有标题字段看起来更方便一些, 那么可以按下面 ...

  2. 浅谈HTTP中GET和POST请求方式的区别

    浅谈HTTP中GET和POST请求的区别 HTTP认知: HTTP是基于TCP/IP的关于数据如何在万维网中如何通信的协议.HTTP的底层是TCP/IP.所以GET和POST的底层也是TCP/IP,也 ...

  3. 开始试用Dynamics 365

    1. 访问地址: https://trials.dynamics.com/Dynamics365/Signup/ ,默认选择第一个应用,也可以选择其他的,不影响,之后还可以添加更多的应用程序. 2. ...

  4. Java Comparator接口学习笔记

    Comparator是一个泛型函数式接口,T表示待比较对象的类型: @FunctionalInterface public interface Comparator<T> { } 本文将主 ...

  5. Java 浅拷贝 深拷贝

    两者区别主要在于引用数据类型的属性,对于基本数据类型采用的是值传递,所以两者一样: 对于浅拷贝,引用数据类型只会进行引用传递,即复制一份引用值(内存地址)给新对象,一个对象的变化会影响到另一个的引用属 ...

  6. 初试Shell脚本

    背景 临上线前测试比较努力,遇到闪退或者其他问题,会把日志包打给我,由于app内存限制,目前每次打包都是1m大小,所以有时查找问题的上下文比较吃力.同时由于日志比较多,根据关键词过滤的需求越来越重要. ...

  7. Oracle扩展包(pipe,alert,job,scheduler)

    --定义包中函数的纯度级别 create or replace package purityTest is type dept_typ is table of dept%rowtype index b ...

  8. Netty源码分析第1章(Netty启动流程)---->第3节: 服务端channel初始化

    Netty源码分析第一章:Netty启动流程   第三节:服务端channel初始化 回顾上一小节的initAndRegister()方法: final ChannelFuture initAndRe ...

  9. Flink架构分析之资源分配

    Task Slot     Flink中每个真正执行任务的TaskManager都是一个JVM进程,其在多线程环境中执行一个或者多个子任务.为了控制一个JVM同时能运行的任务数量,flink引入了ta ...

  10. ltrace命令详解

    原文链接:https://ipcmen.com/ltrace 用来跟踪进程调用库函数的情况 补充说明 NAME       ltrace - A library call tracer ltrace命 ...