1、线程的创建

  C11创建线程非常简单,只需要提供线程函数就行,标准库提供线程库,并可以指定线程函数的参数。

#include <iostream>
#include <thread> void vFunc(int i, int j)
{
std::cout << i << " " << j << std::endl;
} int main()
{
std::thread t(vFunc, , );
t.join(); return ;
}

2、阻塞&非阻塞

  在线程执行的时候,可以选择线程是否阻塞执行,如果阻塞,则主线程等线程函数执行完,再往下执行,否则启动线程之后,主线程直接往下执行。

  join函数会阻塞线程,直到线程函数执行结束,如果线程函数有返回值,返回值会被忽略。

  如果不希望线程阻塞执行,那就需要线程和线程对象分离,让线程作为后台线程执行,当前线程不会阻塞,但是,分离之后的线程就无法再和主线程发生联系,不能再通过join来等待线程执行完成,线程何时执行完成也无法控制。

  需要注意的是,std::thread出了作用域之后将会析构,如果线程函数还未执行完成,则会发生错误,所以,需要保证线程函数的生命周期在线程变量std::thread的生命周期内。

#include <iostream>
#include <thread> void vFunc(int i, int j)
{
std::cout << i << " " << j << std::endl;
} int main()
{
std::thread t(vFunc, , );
t.detach(); //do other thing return ;
}

3、其他用法

3.1 移动

  线程不能复制,但是可以移动。移动后的线程不代表任何线程。

#include <iostream>
#include <thread> void vFunc(int i)
{
//do something
} int main()
{
//1.转移
std::thread t(vFunc, );
std::thread t1(std::move(t)); //t.join(); 将会抛异常
t1.join(); return ;
}

3.2 其他线程函数传入方式

  可以通过std::bind或者lambda表达式来创建线程。

//2.lambda&bind
std::thread t2(std::bind(vFunc, ));
std::thread t3([](int a, int b){}, , ); t2.join();
t3.join();

3.3 线程信息获取

  线程可以获取当前现成的ID,还可以获取当前CPU的核心数量。

#include <iostream>
#include <thread> void vFunc(){} int main()
{
std::thread t(vFunc); //获取当前线程ID
std::cout << t.get_id() << std::endl; //获取CPU核心数量
std::cout << std::thread::hardware_concurrency() << std::endl; return ;
}

3.4 线程休眠

  可以通过std::this_thread::sleep_for来让当前函数休眠一段时间。

#include <iostream>
#include <thread>
#include <chrono> void vFunc()
{
for (int i = ; i < ; i++)
{
std::this_thread::sleep_for(std::chrono::seconds());
std::cout << i << std::endl;
}
} int main()
{
std::thread t(vFunc);
t.join(); return ;
}

C11线程管理:线程创建的更多相关文章

  1. Java基础之线程——管理线程同步方法(BankOperation2)

    控制台程序. 当两个或多个线程共享同一资源时,例如文件或内存块,就需要采取措施,确保其中的一个线程不会修改另一个线程正在使用的资源.当其中的一个线程更新文件中的某个记录,同时另一个线程正在检索这个记录 ...

  2. Java基础之线程——管理线程同步代码块(BankOperation4)

    控制台程序. 除了同步类对象的方法之外,还可以把程序中的语句或代码块制定为synchronized,这种方式更强大,因为可以指定哪个对象从语句或代码块的同步中获益,而不像同步方法那样仅仅是包含代码的对 ...

  3. Android线程管理(二)——ActivityThread

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  4. C11线程管理:异步操作

    1.异步操作 C++11提供了异步操作相关的类,std::future.std::promise和std::package_task.std::future作为异步结果的传输通道,方便的获取线程函数的 ...

  5. 为什么使用 Executor 框架比使用应用创建和管理线程好?

    为什么要使用 Executor 线程池框架 1.每次执行任务创建线程 new Thread()比较消耗性能,创建一个线程是比较耗 时.耗资源的. 2.调用 new Thread()创建的线程缺乏管理, ...

  6. ACE线程管理机制-线程的创建与管理

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/04/581369.html 有过在不同的操作系统下用c++进行过多线程编程的朋友对那些线程处理 ...

  7. Android线程管理之ThreadLocal理解及应用场景

    前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...

  8. C++ 11 多线程--线程管理

    说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...

  9. Android线程管理之Thread使用总结

    前言 最近在一直准备总结一下Android上的线程管理,今天先来总结一下Thread使用. 线程管理相关文章地址: Android线程管理之Thread使用总结 Android线程管理之Executo ...

随机推荐

  1. 2018软工实践—Alpha冲刺(6)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  2. PAT 甲级 1040 Longest Symmetric String

    https://pintia.cn/problem-sets/994805342720868352/problems/994805446102073344 Given a string, you ar ...

  3. Kafka集群无法外网访问问题解决攻略

    Kafka无法集群外网访问问题解决方法  讲解本地消费者和生产者无法使用远程Kafka服务器的处理办法 服务搭建好Kafka服务后,机本.测试 OK,外面机器却无法访问,很是怪异. 环境说明:  Ka ...

  4. 【Linux学习笔记】Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)

    http://blog.csdn.net/slvher/article/details/8864996 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm. ...

  5. java多线程之CAS原理

    前言 在Java并发包中有这样一个包,java.util.concurrent.atomic,该包是对Java部分数据类型的原子封装,在原有数据类型的基础上,提供了原子性的操作方法,保证了线程安全.下 ...

  6. [BinaryTree] 二叉树常考知识点

    1.二叉树第i层至多有2^(i-1)个结点(i>=1). 2.深度为k的二叉树上,至多含2^k-1个结点(k>=1) 3.n0 = n2 + 1(度) 4.满二叉树:深度为k且含有2^k- ...

  7. 【前端学习笔记】JavaScript JSON对象相关操作

    //JSON方法 //JSON.parse(); var json = '{"name":"zj","age":23}'; JSON.par ...

  8. BZOJ 2131 圈地计划(最小割+黑白染色)

    类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...

  9. Day 3 学习笔记

    Day 3 学习笔记 STL 模板库 一.结构体 结构体是把你所需要的一些自定义的类型(原类型.实例(:包括函数)的集合)都放到一个变量包里. 然后这个变量包与原先的类型差不多,可以开数组,是一种数据 ...

  10. 线段树之Sum

    题面: 给定一数列,规定有两种操作,一是修改某个元素,二是求区间的连续和. Input: 输入数据第一行包含两个正整数n,m(n<=100000,m<=500000),以下是m行, 每行有 ...