c++11多线程---线程操作
1、等待线程执行完成
join() 方法数会阻塞主线程直到目标线程调用完毕,即join会直接执行该子线程的函数体部分。
2、暂停线程(线程休眠)
使用std::this_thread::sleep_for或std::this_thread::sleep_until。
#include <thread>
#include <iostream>
#include <chrono> using namespace std::chrono; void pausable() {
// sleep 500毫秒
std::this_thread::sleep_for(milliseconds());
// sleep 到指定时间点
std::this_thread::sleep_until(system_clock::now() + milliseconds());
} int main() {
std::thread thread(pausable);
thread.join(); return ;
}
3、线程终止
一般情况下当线程函数执行完成后,线程“自然”停止。但在std::thread中有一种情况会造成线程异常终止,那就是:析构。当std::thread实例析构时,如果线程还在运行,则线程会被强行终止掉,这可能会造成资源的泄漏,因此尽量在析构前join一下,以确保线程成功结束。
4、线程copy
std::thread a(foo);
std::thread b;
b = a;
将a的线程给了b,a不再管理该线程,如果b原来有线程,则原有线程被析构,管理新线程。
5、子线程分离
detach() 以后就失去了对线程的所有权,不能再调用join了,因为线程已经分离出去了,不再归该实例管了。判断线程是否还有对线程的所有权的一个简单方式是调用joinable函数,返回true则有,否则为无。
#include <thread>
#include <iostream> using namespace std; // 一个普通的函数
void fun(int num)
{
cout << "The function child thread begin...\n";
cout << "I come from function fun(): " << num << '\n';
cout << "The function child thread end...\n";
cout << endl;
} // 一个函数类,实现了operator()方法
class Fun
{
public:
void operator()(int num)
{
cout << "The class child thread begin...\n";
cout << "I come from class Fun: " << num << '\n';
cout << "The class child thread end...\n";
cout << endl;
}
}; int main()
{
cout << "Main thread begin..." << '\n';
cout.sync_with_stdio(true); // 设置输入流cout是线程安全的
thread t_1(fun, ); // 新建线程,第一个参数是函数指针,第二个参数是函数的参数(第二个参数是可变长参数)
t_1.join(); // join方法数会阻塞主线程直到目标线程调用完毕,即join会直接执行该子线程的函数体部分
thread t_2(fun, );
t_2.detach(); // detach方法不会阻塞任何线程,目标线程就成为了守护线程,驻留后台运行
Fun oFun;
thread t_3(ref(oFun), ); //这里新建线程,使用对象进行初始化,这里的通过ref传递的是oFun本身而不是其拷贝
t_3.join();
cout << "Main thread end..." << endl;
return ;
}
c++11多线程---线程操作的更多相关文章
- C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- (转)C++ 11 多线程--线程管理
说到多线程编程,那么就不得不提并行和并发,多线程是实现并发(并行)的一种手段.并行是指两个或多个独立的操作同时进行.注意这里是同时进行,区别于并发,在一个时间段内执行多个操作.在单核时代,多个线程是并 ...
- c++11多线程---线程锁(mutex)
#include<mutex> 包含四类锁: 1 std::mutex 最基本也是最常用的互斥类 2 std::recursive_mutex 同一线程内可递归 ...
- c++11多线程---线程入口函数
1.普通函数(线程入口) #include <thread> #include <iostream> void hello(const char *name) { std::c ...
- c++11 多线程新特性学习 (1) 管理线程
1.基础介绍 c++11中,线程是通过std::thread对象来开始的,用法为 #include<thread> //必须包含的头文件 void do_work(){ std::cout ...
- 2.2多线程(java学习笔记)线程状态及线程操作的相关方法
一.线程的状态 线程一般具有五种状态,即创建.就绪.运行.阻塞.终止. 它们之间的关系: 二.线程操作相关方法 1.设置和取得线程名称. 如果不设置线程名称,系统会自动分配线程名,一般格式为Threa ...
- java JDK8 学习笔记——第11章 线程和并行API
第11章 线程与并行API 11.1 线程 11.1.1 线程 在java中,如果想在main()以外独立设计流程,可以撰写类操作java.lang.Runnable接口,流程的进入点是操作在run( ...
- C++11多线程教学(二)
C++11多线程教学II 从我最近发布的C++11线程教学文章里,我们已经知道C++11线程写法与POSIX的pthreads写法相比,更为简洁.只需很少几个简单概念,我们就能搭建相当复杂的处理图片程 ...
- C++11多线程教学(一)
本篇教学代码可在GitHub获得:https://github.com/sol-prog/threads. 在之前的教学中,我展示了一些最新进的C++11语言内容: 1. 正则表达式(http://s ...
随机推荐
- PhpStorm 2017.3-2018.2 汉化包
JetBrains 系列软件汉化包 关键字: Android Studio 3.0-3.1.3 汉化包 CLion 2018.1-2018.2 汉化包 GoLand 2017.3.2-2018.2 汉 ...
- 完整的JavaScript包括三部分、script标签、JavaScript的基本语法以及变量和字面量的关系
完整的JavaScript包括三大部分: -ECMAScript JavaScript的开发规范:提供核心语言功能 -DOM document object model 文档对象模型:提供 ...
- net 网站过滤器 mvc webapi
WebApi过滤器1 public class TestController : ApiController { /// <summary> /// 获取用户信息 /// </sum ...
- 为什么现在UML很少用了
新霸哥发现UML在面向对象的设计中的需求,相关行为.一些体系结构的实现提供了一套综合完整的表示法,但是由于使用的人比较少,初学者不容易快速入门,所以就导致了UML不是那么的受欢迎. UML在开发中有什 ...
- Hibernate 最简单实例
我从网上下载了 hibernate-release-4.3.0.Final.zip,解压缩,把/lib/required文件夹下的所有jar包加入到eclipse项目中的Referenced Libr ...
- GDAL栅格矢量化
在这里主要提供直接能用的栅格矢量化代码,这个函数中路径输入为QStrng,如果是其他类型的,请直接转成const char *: bool Polygonize(const QString& ...
- Win10+Linux(CentOS) 双系统安装教程--踩坑实录
最近心血来潮想给自己的笔记本装一套linux系统作为开发环境, 说干就干,首先先收集一下现在linux主流版本, 貌似现在市场上应用服务器比较多的是redhat相关产品,而ubuntu的优势在于它庞大 ...
- jquery在线引用地址大全 全部来自官网
谷歌的就算了,容易被屏蔽,下面都是官方原版的 最新版本 <script src="http://code.jquery.com/jquery-latest.js">&l ...
- linux 生成密钥和公钥,实现免密登录
1. 在相应的用户根目录下生成密钥公钥,输入如下命令: ssh-keygen -t rsa 2. 直接三次回车:会生成两个文件:id_rsa / id_rsa.pub,分别为密钥和公钥 3. 打开公 ...
- 02/Oct/2019:11:55:28 类型的时间转换为
public static String upDataTime(String time) { Date upTime = new Date(); String newtime = null; Simp ...