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 ...
随机推荐
- 【转载】Django自带的注册登陆功能
1.登陆 知识点: a.auth.authenticate(username=name值, password=password值) 验证用户名和密码 b.auth.login(request, use ...
- 剑指offer-5:十进制转二进制
一.二进制中‘1’的个数 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. public class Solution { public int NumberOf1(int n) { ...
- 基于新版 node 的 vue 脚手架搭建
1. node 安装版本 9+ 2. 命令行 创建方式 vue create project 3. 可视化 创建方式 vue ui 4. 扩展 goole 下 vue 调试工具安装 git 资源 ...
- Eclipse集成开发环境搭建
gdbserver安装: 安装gdb-server的环境变量要放在arm-linux-gcc的环境的前面,因为arm-linux-gcc的安装包里面也有gdb,linux系统在找指令时从/root/. ...
- CCPC-Wannafly Winter Camp Day8 (Div2, onsite) A 题 Aqours (精巧的树形DP)
题目链接: https://www.cometoj.com/contest/29/problem/A?problem_id=414 Aqours 题目描述 Aqours 正在 LoveLive! 决赛 ...
- 批量修改zencart产品价格、原价、特价、产品属性价格
批量修改zencart商品价格无非只有下面几种情况: 一 在原来基础上批量调高一定比例 二 将原来的价格批量换成一个新的价格 针对第一种情况的话,网上很多人已经给出了解决办法: 利用SQL语句批量修改 ...
- aes前台加密后台解密
aes加密npm地址:https://www.npmjs.com/package/crypto-js aes加密git地址/下载: https://github.com/brix/crypto-js ...
- Mac 升级python2.7 到 3.5
Mac 系统 OSX 10.12 以上 第1步:下载Python3.5 下载地址如下: Python3.5 第二步:安装python 3.50 点击下载好的pkg文件进行安装,安装完成之后,pyt ...
- python路径拼接os.path.join()函数的用法
os.path.join()函数:连接两个或更多的路径名组件 1.如果各组件名首字母不包含’/’,则函数会自动加上 2.如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃 3.如果最后一个组 ...
- BZOJ - 2243 染色 (LCT链修改+链查询)
同样是可以用LCT解决的树剖问题之一. 注意反转的时候要考虑对左右端点颜色的影响,而且要先反转再打标记(这点不知道为啥) #include<bits/stdc++.h> using nam ...