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 ...
随机推荐
- C#获取局域网主机
C#获取局域网主机 最近在做一个使用MSRDPClient来实现远程桌面功能,需要先判断一下该局域网主机是否在线,所以就需要获取一遍局域网主机. 首先获取本地IP地址,这里需要注意的是,要排除掉虚拟机 ...
- JS实现hasClass addClass removeClass
// 判断class有无 function hasClass(ele, cls) { if (ele) { cls = cls || '' if (cls.replace(/\s/g, '').len ...
- 缺少库libresolv
"_dns_free_resource_record", referenced from: -[xxxx processRecord:length:] in xxx.a(xxx.o ...
- AIX中磁带设备的使用
1.AIX中的磁带设备 在UNIX系统中,磁带一般具有如下共同属性. 磁带密度:指磁带使用时采用的低密度方式和高密度方式 回退操作:磁带一次写入操作完成后,是否立刻倒带,回退到磁带头部. 位置 ...
- RHEL6查看运行级别和grub加密阻止进入单用户模式
1.查看当前运行级别 [root@cluster01 ~]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.5 ( ...
- java面试(Web相关)06
1.JSP 和 servlet 有什么区别? JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式.servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑 ...
- canvas在高倍屏下变模糊的处理办法
因为canvas不是矢量图,而是像图片一样是位图模式的.如果不做Retina屏适配的话,例如二倍屏,浏览器就会以2个像素点的宽度来渲染一个像素,该canvas在Retina屏幕下相当于占据了2倍的空间 ...
- 浅谈java虚拟机|系列1|架构简介
今天开了一个专题.谈谈我们java程序员每天面对的java虚拟机(jvm). 本质上来说,jvm分两部分:编译器(compiler)和运行时(runtime). 所谓的编译器,简单来说,他就是个翻译机 ...
- HDU-3415-Max Sum of Max-K-sub-sequence(单调队列,带限制的最大子段和)
链接: https://vjudge.net/problem/HDU-3415 题意: Given a circle sequence A[1],A[2],A[3]......A[n]. Circle ...
- C#调用Python(一)
python文件中未引入其他包.模块 以下方法不适用于pyhton 文件有第三方包.模块,有第三方包,模块的实现方法,请戳这里→https://www.cnblogs.com/zhuanjiao/p/ ...