当前位置: 首页 > news >正文

c++11多线程学习

一.join和detach

C++中的thread对象通常来说表达了执行的线程(thread of execution),这是一个操作系统或者平台的概念。

当thread::join()函数被调用后,调用它的线程会被block,直到线程的执行被完成。基本上,这是一种可以用来知道一个线程已结束的机制。当thread::join()返回时,操作系统的执行的线程已经完成,C++线程对象可以被销毁。

当thread::detach()函数被调用后,执行的线程从线程对象中被分离,已不再被一个线程对象所表达--这是两个独立的事情。C++线程对象可以被销毁,同时OS执行的线程可以继续。如果程序想要知道执行的线程何时结束,就需要一些其它的机制。join()函数在那个thread对象上不能再被调用,因为它已经不再和一个执行的线程相关联。

去销毁一个仍然可以“joinable”的C++线程对象会被认为是一种错误。为了销毁一个C++线程对象,要么join()函数需要被调用(并结束),要么detach()函数被调用。如果一个C++线程对象当销毁时仍然可以被join,异常会被抛出。

因此,你应该在执行流程到析构函数前总是要么join,要么detach一个线程

https://www.cnblogs.com/LuckCoder/p/10950583.html

void function_1() {cout << "函数function_1\n";
}
int main() {thread t1(function_1);//t1.join();t1.detach();if (t1.joinable()) {t1.join();}return 0;
}

二.ref move

string s = "Main";thread t1(Fctor(), s);t1.join();thread t2(Fctor(), ref(s));t2.join();thread t3(Fctor(), move(s));t3.join();thread t4 = move(t3);cout << this_thread::get_id() << endl;cout << t3.get_id() << endl;cout << _Thrd_hardware_concurrency() << endl; //线程最大数

三.lock  lock_guard   unique_lock

lock:

void shared_print1(string id, int value) {
        m_mutex1.lock();
        cout << "From " << id << " " << value << endl;
        m_mutex1.unlock();
    }

lock_guard:

void shared_print1(string id, int value) {
        // 顺序不一样会发生死锁
        lock_guard<mutex> locker2(m_mutex2);
        lock_guard<mutex> locker1(m_mutex1);
        
        cout << "From " << id << " " << value << endl;
    }
    void shared_print2(string id, int value) {
        lock_guard<mutex> locker1(m_mutex1);
        lock_guard<mutex> locker2(m_mutex2);
        cout << "From " << id << " " << value << endl;
    }

要么使用lock函数:
        lock(m_mutex1, m_mutex2);

unique_lock:

用法更加灵活,但占用更多cpu

void shared_print1(string id, int value) {
        unique_lock<mutex> locker(m_mutex1, defer_lock);
        //..
        locker.lock();
        cout << "From " << id << " " << value << endl;
        locker.unlock();
        //..

        locker.lock();
        //....
        locker.unlock();

        // 只能移动不能复制
        unique_lock<mutex> locker2 = move(locker);
    }

四.call_once

有些代码我们只进行一次,第一种需要不断加锁,第二种只会执行一次

      {
            unique_lock<mutex> locker(m_mutex1, defer_lock);
            if (!f.is_open()) {
                f.open("log.txt");
            }

        }
        call_once(m_flag, [&]() {f.open("log.txt"); });

五.条件变量condition_variable 

牵扯到解锁,只能用unique_lock

https://www.cnblogs.com/GuoXinxin/p/11675053.html

deque<int> q;
mutex mu;
condition_variable cond;
void function_1() {int count = 10;while (count > 0) {unique_lock<mutex> locker(mu);q.push_back(count);locker.unlock();cond.notify_one();//cond.notify_all(); //激活所有线程this_thread::sleep_for(chrono::seconds(1));count--;}
}
void function_2() {int data = 0;while (data != 1) {unique_lock<mutex> locker(mu);cond.wait(locker, []() {return !q.empty(); });data = q.back();q.pop_back();locker.unlock();cout << "t2 got a value from t1 : " << data << endl;}
}
int main() {thread t1(function_1);thread t2(function_2);t1.join();t2.join();

生产者消费者问题:

list<int> q;
mutex mu;
condition_variable cond;
int flag;
void function_1() {int count = 0;while (count < 10) {unique_lock<mutex> locker(mu);q.push_back(count);cout << "生产: " << count << endl;locker.unlock();cond.notify_one();count++;}flag = 1;
}
void function_2() {int tmp;while (1) {unique_lock<mutex> locker(mu);cond.wait_for(locker, chrono::seconds(1) ,[]() {return !q.empty(); });if (flag && q.empty()) {break;}tmp = q.front();q.pop_front();cout << "消费: " << tmp << endl;locker.unlock();}
}
int main() {thread t1(function_1);thread t2(function_2);t1.join();t2.join();

六.future promise async

https://blog.csdn.net/jiange_zh/article/details/51602938

int factorial(future<int>& fu) {int res = 1;int N = fu.get();for (int i = 1; i <= N; i++) res *= i;return res;
}
int main() {promise<int> p;future<int> fu = p.get_future();future<int> fu1 = async(launch::async, factorial, ref(fu));p.set_value(4);int x = fu1.get();cout << "Get from child: " << x << endl;

future:

可以处理所有在线程间数据转移的必要同步,但是future模型独享同步结果的所有权。并且通过 get() 函数,一次性的获取数据,让并发访问变的毫无意义。你的并发代码没有办法让多个线程等待同一个事件。

shared_future:

可以完成让多个线程的等待

	promise<int> p;future<int> fu = p.get_future();shared_future<int> sf = fu.share();future<int> fu1 = async(launch::async, factorial, sf);future<int> fu2 = async(launch::async, factorial, sf);future<int> fu3 = async(launch::async, factorial, sf);

七.创建线程的几种方式

https://blog.csdn.net/mmk27_word/article/details/108187405

八.packaged_task

 

九:时间约束

thread t1(factorial, 5);this_thread::sleep_for(chrono::milliseconds(3)); //时间段chrono::steady_clock::time_point tp = chrono::steady_clock::now() + chrono::milliseconds(3);this_thread::sleep_until(tp); // 时间点mutex mu;unique_lock<mutex> locker(mu);locker.try_lock_for(chrono::microseconds(3));locker.try_lock_until(tp);condition_variable cond;cond.wait_for(locker, chrono::microseconds(3));cond.wait_until(locker, tp);promise<int> p;future<int> f = p.get_future();f.wait_for(chrono::microseconds(3));f.wait_until(tp);

 

相关文章:

c++11多线程学习

一.join和detach C中的thread对象通常来说表达了执行的线程&#xff08;thread of execution&#xff09;&#xff0c;这是一个操作系统或者平台的概念。 当thread::join()函数被调用后&#xff0c;调用它的线程会被block&#xff0c;直到线程的执行被完成。基本上&#xff0…...

Socket编程

C Socket 编程&#xff1a;https://blog.csdn.net/sinat_35866463/article/details/81019778 windows环境下用c实现socket编程&#xff1a;https://blog.csdn.net/xiaoquantouer/article/details/58001960 win7系统两台电脑之间利用Socket实现文件传输---C实现&#xff1a;ht…...

inet_pton()和inet_ntop()函数

https://blog.csdn.net/zyy617532750/article/details/58595700 1.把ip地址转化为用于网络传输的二进制数值 int inet_aton(const char *cp, struct in_addr *inp); inet_aton() 转换网络主机地址ip(如192.168.1.10)为二进制数值&#xff0c;并存储在struct in_addr结构中&a…...

C/C++内存泄漏及检测

“该死系统存在内存泄漏问题”&#xff0c;项目中由于各方面因素&#xff0c;总是有人抱怨存在内存泄漏&#xff0c;系统长时间运行之后&#xff0c;可用内存越来越少&#xff0c;甚至导致了某些服务失败。内存泄漏是最难发现的常见错误之一&#xff0c;因为除非用完内存或调用…...

八大设计模式原则

1.依赖倒置原则 高层模块不依赖底层模块&#xff0c;二者都应该依赖抽象 抽象不依赖实现细节&#xff0c;实现细节应该依赖于抽象 这一原则与下面的针对接口编程而不是针对实现编程是一个道理&#xff0c;我们设计一个程序&#xff0c;我们应该先想好我们想要抽象什么&#x…...

C++设计模式

管理变化&#xff0c; 提高复用 两种手段&#xff1a;分解 抽象 八大原则&#xff1a;https://blog.csdn.net/mmk27_word/article/details/108521903 重构技法&#xff1a; 静态 -> 动态 早绑定 -> 晚绑定 继承 -> 组合 编译时依赖 -> 运行时依赖 紧耦合 ->…...

LRU算法

#include <iostream> #include <list> #include <map> using namespace std; class LRU {struct node {int key, val;node(int k_ 0, int v_ 0) {key k_;val v_;}};public:int cap; // 大小map<int, list<node>::iterator> mp;list<node&…...

数据库事务四个特性

ACID特性 数据库管理系统中事务(transaction)的四个特性&#xff08;分析时根据首字母缩写依次解释&#xff09;&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;、持久性&#xf…...

Git入门简介

本文简单介绍一下Git的使用&#xff0c;主要内容有下&#xff1a; Git基本介绍Git相较于SVN的优势Git使用流程及常用命令 Git基本介绍 Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目 —— [ 百度百科 ] GitHub&#xff1a;https…...

《移动App测试实战》读书笔记

总的来讲&#xff0c;这本书基本涵盖了移动App测试的方方面面&#xff0c;并结合各个专题做了简单讲解&#xff0c;对于扩展无线端测试的知识面有极大的好处&#xff0c;缺点是知识点点到为止&#xff0c;毕竟全书300多页的篇幅也不可能对知识点进行专题讲解。书中作者提到的一…...

http load介绍

前几天工作中要对项目的接口做简单压测&#xff0c;就使用了http load做了简单测试&#xff0c;下面介绍一下这款工具的使用说明。简介&#xff1a;http_load是基于linux平台的性能测试工具&#xff0c;它体积非常小&#xff0c;仅100KB。它以并行复用的方式运行&#xff0c;可…...

工具介绍:ITerm 2

今天介绍一款终端工具ITerm2&#xff0c;有了它&#xff0c;大大提供了我们的工作效率&#xff1b;官方地址&#xff1a;http://www.iterm2.com/ 颜控首选&#xff0c;不多说&#xff0c;上图&#xff1a; bg图片、字体、颜色等都可以在Preferences里设置&#xff0c;强大&…...

shell编写图片抓取器

最近在看《Linux Shell脚本攻略》一书&#xff0c;书中有个图片抓取器的script&#xff0c;抓取出来记录一下。适用范围&#xff1a;适合抓取html里符合img标签正则规则的图片。 #!/bin/bash if [ $# -ne 3 ] thenecho "Usage: $0 URL -d DIRECTORY"exit -1 fi for …...

SSH免密码登录

公司服务器很多的话&#xff0c;如果每次连接都需要输入密码&#xff0c;那就太麻烦了。So&#xff0c;免密登录就可以大大提高我们的工作效率了。 下面介绍ssh免密登录的方法&#xff1a; 实现步骤&#xff1a; 1.在你的自己的机器下面使用ssh-keygen命令来实现创建公钥 使…...

Jmeter访问HTTPS请求

公司最近在搞全站HTTPS改造&#xff0c;进一步提高网站的安全性&#xff0c;防止运营商劫持。那么&#xff0c;改造完成后&#xff0c;所有前后端的URL将全部为https。 So &#xff0c;研究下怎么用Jmeter访问https请求呢。 其实很简单&#xff0c; 第一步在jmeter中创建HTT…...

《Maven实战》读书笔记

之前对Maven有些认识&#xff0c;通过这本书《Maven实战》一起系统的回顾一下&#xff0c;总结的东西不会很全面&#xff0c;但都是日常工作中最常用的。 简介&#xff1a; maven翻译为“知识的积累”&#xff0c;基于项目对象模型&#xff08;Project Object Model&#xff0…...

github/gitlab 管理多个ssh key

以前只使用一个 ssh key 在github上提交代码&#xff0c;由于工作原因&#xff0c;需要再添加一个ssh key在公司的 gitlab上提交代码&#xff0c;下面记录下配置过程&#xff0c;防止遗忘。 生成并添加第一个ssh key 第一次使用ssh生成key&#xff0c;默认会在用户~&#xff…...

解决部分国产机连不上adb shell的办法

手里头认领了公司的部分测试机&#xff0c;但是工作中发现部分手机连上usb后&#xff0c;adb devices识别不出设备。下面总结一下解决办法&#xff1a; 魅蓝Note2&#xff1a; 1.在命令行输入 system_profiler SPUSBDataType,查看连接的usb设备的信息&#xff0c;如下图&…...

流式断言器AssertJ入门介绍

之前一直使用Junit自带的Assert类进行断言&#xff0c;尽管这能满足一些我们最基础的需要&#xff0c;但从功能上来讲还是不够强大的。 今天介绍一款功能强大的流式断言器AssertJ&#xff0c;所谓的流式断言就是相较于Assert的单个校验点断言&#xff0c;支持一条断言语句对实…...

单元测试框架-Junit介绍

在工作中编写接口脚本中经常用到junit作为测试框架&#xff0c;下面总结一下junit的用法和编写规范&#xff0c;供大家参考。 junit简介&#xff1a; 基于Java语言的单元测试框架&#xff0c;在日常工作中被广泛运用于单元测试和接口测试。 junit官网&#xff1a;http://jun…...

TestNG使用总结

TestNG简介&#xff1a; TestNG是一个测试框架&#xff0c;其灵感来自JUnit和NUnit&#xff0c;但同时引入了一些新的功能&#xff0c;使其功能更强大&#xff0c;使用更方便。 TestNG相较于Junit的优点&#xff1a; 可指定执行顺序&#xff0c; dependsOnMethods 属性来应对…...

基于数据驱动的接口自动化测试解决方案

总结一下我么项目中使用的基于数据驱动的接口自动化测试解决方案&#xff0c;仅供大家参考。1.接口框架设计结构 2.接口测试脚本设计原则 3.持续集成 这块用jenkins就可以了&#xff0c;就不介绍了&#xff0c;目前我们项目的集成规则介绍一下&#xff1a; 1.脚本job与应用对…...

python数据类型

重温python数据类型&#xff0c;重点掌握str&#xff0c;list&#xff0c;tuple及dict类型。...

Python高级特性

Python高级特性 切片迭代及迭代器列表生成式生成器 这些高级特性的作用都是一样的&#xff0c;为了代码的简洁、高效运行。 切片 切片让取一个list或tuple的部分元素变得相当简单&#xff0c; e.g: L[‘jack’,’mike’,’jerry’] 那么第一个位置&#xff0c;索引为0&a…...

ADB学习笔记

简介&#xff1a; ADB的全称为Android Debug Bridge&#xff08;调试桥&#xff09;&#xff0c; 它是一个客户端-服务器端程序&#xff0c;其中客户端是你用来操作的电脑, 服务器端是android设备。作用显而易见&#xff0c;能方便我们在PC上对手机进行调试的一些工作。 原理…...

Appium简介

Appium简介 Appium is an open source, cross-platform test automation tool for native, hybrid and mobile web apps, tested on simulators (iOS), emulators (Android), and real devices (iOS, Android, Windows). 优缺点 优点显而易见&#xff0c;支持webview、hybri…...

Appium-java API详解

目前appium-java最新版本是5.0.0-BETA3&#xff0c;因此就拿最新的说明&#xff0c;以Java为例&#xff0c;首先引入java client的依赖&#xff1a;<dependency><groupId>io.appium</groupId><artifactId>java-client</artifactId><version&g…...

Appium学习遇到的坑

安装篇 Q1&#xff1a;安装时要求java运行环境为最低1.8&#xff0c;我原先的jdk1.7无法运行。 A1&#xff1a;升级jdk后解决。附appium安装教程 配置篇 Q2&#xff1a;运行提示error&#xff1a;Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND lo…...

每天一个adb命令:pm 命令详解

介绍adb shell中一个很重要的命令——pm&#xff08;Package Manager&#xff09;&#xff0c;这个命令主要用于获取和安装在 Android 设备上的应用信息。 关于pm命令的用法解析。命令行下输入adb shell pm即可获得关于pm的用法帮助&#xff0c;如下所示&#xff1a; usage: …...

每天一个adb命令:am 命令详解

am 这个命令可以帮助我们直接启动activity、service及广播。 adb shell am 可以查看命令的详细说明。 usage: am [subcommand] [options] usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>][--sampling INTERVAL] [-R COUNT] [-S] [--opengl-tra…...

每天一个adb命令:input 命令详解

input命令可以用于向键盘发送一些指令&#xff0c;先看看input的官方说明&#xff1a; Usage: input [<source>] <command> [<arg>...]The sources are:mousekeyboardjoysticktouchnavigationtouchpadtrackballstylusdpadtouchscreengamepadThe commands an…...

每天一个adb命令:screen 命令详解

screen命令分为截屏screencap命令及录制视频screenrecord命令。 screencap命令&#xff1a; sage: screencap [-hp] [-d display-id] [FILENAME]-h: this message-p: save the file as a png.-d: specify the display id to capture, default 0. If FILENAME ends with .png …...

每天一个adb命令:wm命令详解

wm命令可以用于获取屏幕分辨率、像素密度等。 前提&#xff1a;Android4.3及以上 usage: wm [subcommand] [options]wm size [reset|WxH]wm density [reset|DENSITY]wm overscan [reset|LEFT,TOP,RIGHT,BOTTOM]wm size: return or override display size.wm density: overrid…...

每天一个adb命令:dumpsys命令详解

dumpsys是一个能帮助我们对手机进行性能分析的命令&#xff0c;它可以帮助我们获取电池、内存、cpu、磁盘、wifi等等信息&#xff0c;具体能查询的信息可以通过命令&#xff1a; adb shell dumpsys | grep DUMP OF SERVICE DUMP OF SERVICE DockObserver: DUMP OF SERVICE Sm…...

每天一个adb命令:monkey命令详解

国际惯例&#xff0c;先用adb shell monkey 看看具体用法。 具体用法 usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...][-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...][--ignore-crashes] [--ignore-timeouts][--ignore-security-exceptions][--monitor-native-cra…...

JSON相关知识点

JSON是工作中经常会遇到的一种数据结构&#xff0c;下面来讲讲与他相关的一些知识点。 JSON简介&#xff1a; JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法,类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。 JSONObj…...

markdown编写入门

什么是markdown&#xff1f; Markdown 是一种轻量级的「标记语言」&#xff0c;通过简单的标记符号来格式化排版&#xff0c;是文本展现的更加优美&#xff0c;形象。 markdown优点&#xff1a; 1.不像office&#xff0c;存在版本兼容问题&#xff0c;markdown无此问题&#…...

log4j学习demo

log4j简介 Log4j是Apache的一个开放源代码项目&#xff0c;是项目中比较常用的日志记录组件。 引入log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.14</version></dependency> log4…...

idea常用技巧收集

idea相比eclipse的优点我在这里就不赘述了&#xff0c;更多参考&#xff1a;idea官网,本文重点讲下自己在idea使用过程中常用的一些技巧&#xff0c;以后随时更新…… 主要分成三大块&#xff1a; 1. 系统设置 2. 快捷键 3. 其他设置 系统设置 主题风格设置&#xff1a;默…...

浅谈spring

这个话题感觉是老生常谈了&#xff0c;但是作为基础&#xff0c;我还是要沉淀一下&#xff0c;深刻认识。 spring核心思想 简洁的讲spring的核心思想就是两个特性&#xff1a;控制反转(IOC)和面向切面(AOP) 。 但是这两个概念却不太容易理解&#xff0c;我一开始也不太理解&…...

spring装配bean

最近在看《spring实战》一书&#xff0c;记录下spring装配bean这一章中自己学到的一些知识点。下面简单说明下bean和装配这两个概念的意思。 bean&#xff1a;在spring中代表组件&#xff0c;通过bean将不同的组件联系在一起。装配&#xff1a;是指创建应用对象之间协作关系的行…...

初识spring RestTemplate

《spring实战》读书笔记之初识spring RestTemplate。首先需要先了解下什么是REST。 REST&#xff1a;官方解释&#xff0c;表述性状态转移。 感觉还是不知所云&#xff0c;参考下怎样用通俗的语言解释REST&#xff0c;以及RESTful&#xff1f; 即URL定位资源&#xff0c;用H…...

记一次爬虫实践(一):思路及模拟登录

需求背景 因为我们的应用通常运行在h5上&#xff0c;因此图片格式选择了加载较快的webp格式&#xff0c;但是运营提起有在pc上批量下载图片&#xff08;要求图片格式&#xff09;的需求&#xff0c;目前比较麻烦&#xff0c;需要登录h5-找到接口中对应图片资源-一张张另存为到…...

记一次爬虫实践(二):下载图片及打包

登录之后&#xff0c;我们开始下载图片。 这里把完整程序po一下。 程序中用到的框架是flask&#xff0c;参考Flask文档 # encodingUTF-8 import zipfileimport flask import requests import os import urllib2 import time from flask import Flask, jsonifyapp Flask(__n…...

spring boot入门学习

spring boot 入门基础前言什么是spring boot&#xff1f;为什么要用spring boot&#xff1f;spring boot的常用注释有哪些&#xff1f;Controller层RequestMapping详解配置相关自动配置一个简单的demo实践idea如何新建spring boot项目&#xff1f;前言 微服务这个概念最近比较…...

常用HTML标签简介

HTML&#xff1a;超文本标记语言 这个没啥技术含量&#xff0c;这里只是简单介绍&#xff0c;主要是要熟能生巧。 布局相关&#xff1a; <!-- 标记导航 --><nav></nav> <!-- 标记侧边栏 --><aside></aside> <!-- 标记正文 --><…...

idea插件开发入门

前言&#xff1a;最近想研究一款自动在idea中定位缺陷及发送JIRA的快捷工具&#xff0c;方便提升报自动化脚本的bug的效率。因为idea插件学习是必不可少了&#xff0c;沉淀小结如下。 idea插件开发入门插件用途工程创建配置文件Action实现开发语法常用对象常用方法运行效果打包…...

spring boot深入及启动原理探究

围绕spring boot 的优点&#xff0c;本文我们来探究一下spring boot具体是如何实现这些特性的。 自动配置&#xff1a;针对很多Spring应用程序和常见的应用功能&#xff0c;Spring boot能自动提供相关配置&#xff1b;起步依赖&#xff1a;告诉Spring boot需要什么功能,它就能引…...

接口测试那些事儿

什么是接口&#xff1f; 首先&#xff0c;在讲接口测试之前&#xff0c;我们先要搞清楚接口类型的概念。 接口&#xff1a;可能是系统与系统&#xff08;包括服务与服务&#xff09;之间的调用&#xff0c;像A系统&#xff08;服务&#xff09;给B系统&#xff08;服务&#x…...

myeclipse的一些使用技巧

一直都是看别人的博客&#xff0c;学习别人的心得&#xff0c; 但是软件行业涉及的技术太多&#xff0c;学过的很多东西都忘了&#xff0c;今天我也弄个博客玩玩&#xff0c; 把我所学的&#xff0c;工作中遇到的问题也做做记录&#xff0c;方便自己&#xff0c;也方便他人&…...