1. 简介

2. 线程使用

2.1 demo

#include <iostream>
#include <thread>
#include <future>
using namespace std; void helloworld()
{
cout << "hello world \n";
} int main()
{ //开启一个线程
std::thread t(helloworld);
std::cout << "hello world main thread\n"; //线程的终结
t.join(); return ;
}

2.2 一个简单的应用

  • 查看当前线程id: this_thread::get_id()
  • 比较单线程和多线程工作的效率(如果工作不太消耗时间,多线程反而比单线程更耗时间)
#include <iostream>
#include <thread>
#include <chrono>
#include <future>
#include <cmath>
#include <vector>
#include <cstdlib>
using namespace std; double caculate(int v)
{
if (v <= ) {
return v;
}
//假设这个计算很慢
this_thread::sleep_for(chrono::milliseconds());
return sqrt((v * v + sqrt((v - ) * (v + 2.5)) / 2.0) / v);
} template<typename Iter, typename Fun>
double visitRange(thread::id id, Iter iterBegin, Iter iterEnd, Fun func)
{
auto curId = this_thread::get_id();
if (id == this_thread::get_id()) {
cout << curId << " hello main thread\n";
}
else {
cout << curId << " hello work thread\n";
}
double v = ;
for (auto iter = iterBegin; iter != iterEnd; ++iter) {
v += func(*iter);
}
return v;
} int main()
{
auto mainThreadId = std::this_thread::get_id();
//开启一个线程
std::vector<double> v;
for (int i = ; i < ; i++)
{
v.push_back(rand());
}
cout << v.size() << endl;
double value = 0.0;
auto st = clock();
for (auto & info : v)
{
value += caculate(info);
}
auto ed = clock();
cout << "single thread: " << value << " " << ed - st << "time" << endl; //下面用多线程来进行 auto iterMid = v.begin() + (v.size() / ); // 指向整个vector一半部分
//计算后半部分
double anotherv = 0.0;
auto iterEnd = v.end();
st = clock(); std::thread s([&anotherv, mainThreadId, iterMid, iterEnd]() { // lambda
anotherv = visitRange(mainThreadId, iterMid, iterEnd, caculate); });
// 计算前半部分
auto halfv = visitRange(mainThreadId, v.begin(), iterMid, caculate); //关闭线程
s.join(); ed = clock();
cout << "multi thread: " << (halfv + anotherv) << " " << ed - st << "time" << endl; return ;
}

深入学习c++--多线程编程(一)的更多相关文章

  1. Linux学习 :多线程编程

    1.Linux进程与线程() 进程:通过fork创建子进程与创建线程之间是有区别的:fork创建出该进程的一份拷贝,创建时额外申请了新的内存空间以及存储代码段.数据段.BSS段.堆.栈空间,     ...

  2. ballerina 学习十七 多线程编程

    并发&&多线程开发对于日常的处理是比较重要的,ballerina 支持的模式有work fork/join async lock 基本workers 参考代码 import balle ...

  3. APUE学习之多线程编程(三):线程属性、同步属性

    一.线程属性      可以使用pthread_attr_t结构修改线程默认属性,并这些属性和创建的线程练习起来,可以使用pthread_att_init函数初始化pthread_attr_t结构,调 ...

  4. APUE学习之多线程编程(二):线程同步

         为了保证临界资源的安全性和可靠性,线程不得不使用锁,同一时间只允许一个或几个线程访问变量.常用的锁有互斥量,读写锁,条件变量           一.互斥量      互斥量是用pthrea ...

  5. APUE学习之多线程编程(一):线程的创建和销毁

    一.线程标识      和每个进程都有一个进程ID一样,每个线程也有一个线程ID,线程ID是以pthread_t数据类型来表示的,在Linux中,用无符号长整型表示pthread_t,Solaris ...

  6. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  7. 深入学习c++--多线程编程(三)thread的两种死法

    1. 生成了一个线程,需要告诉编译器是否管理 必须告诉编译器是不管理还是管理,否则直接down了 #include <iostream> #include <thread> # ...

  8. 深入学习c++--多线程编程(二)【当线程间需要共享非const资源】

    1. 遇到的问题 #include <iostream> #include <thread> #include <chrono> #include <futu ...

  9. 吴裕雄--天生自然 JAVA开发学习:多线程编程

    class RunnableDemo implements Runnable { private Thread t; private String threadName; RunnableDemo( ...

随机推荐

  1. JDK源码那些事儿之DelayQueue

    作为阻塞队列的一员,DelayQueue(延迟队列)由于其特殊含义而使用在特定的场景之中,主要在于Delay这个词上,那么其内部是如何实现的呢?今天一起通过DelayQueue的源码来看一看其是如何完 ...

  2. epoll版http服务器

    epoll是事件通知方式接收数据,效率比轮询要高 代码: import socket import re import select def client_server(new_client,recv ...

  3. 快速IO

    namespace IO { #define gc() (iS==iT?(iT=(iS=ibuff)+fread(ibuff,1,SIZ,stdin),(iS==iT?EOF:iS++)):iS++) ...

  4. 域渗透:IPC$ 命名管道

    介绍:IPC$(Internet Process Connection) 是共享 " 命名管道 " 的资源,它是为了让进程间通信而开放的命名管道,通过提供可信任的用户名和口令,连接 ...

  5. 织梦关于表情符后面跟着css样式修改

    织梦关于表情符后面跟着css样式修改,前段页面是会员中心里,后台是会员心情管理 前段修改路径找到member\index_do.php  大约在396行,找不到搜索  ‘对表情进行解析’  替换下面的 ...

  6. mage Ansible学习3 ansible role实例

    一.ansible配置文件解析 1./etc/ansible/ansible.cfg配置文件详解 [root@node3 ~]# cat /etc/ansible/ansible.cfg |grep ...

  7. AtCoder Grand Contest 014题解

    传送门 \(A\) 首先大力猜测一下答案不会很大,所以次数大于\(10^6\)输出\(-1\)就行了 不过我并不会证上界,据说是因为如果\(a=b=c\)且都是偶数肯定\(-1\),否则设\(a\le ...

  8. We found potential security vulnerabilities in your dependencies. Only the owner of this reposito...

    删除package-lock.json并同步到git 定义的依赖项./package-lock.json具有已知的安全漏洞 找到一个叫做.gitignore,把package-lock.json贴在这 ...

  9. 【一起来烧脑】一步学会Vue.js系统

    Vuejs是一个构建数据驱动的web界面的库,通过api实现响应的数据绑定和组合的视图组件,Vue.js的核心是一个响应的数据绑定系统,它让数据与DOM保持同步非常简单,一旦创建了绑定,DOM 将与数 ...

  10. (4)Go程序结构和流程控制

    Go程序主要由以下几部分组成:(具体可以参考2选择结构中的实例) *包声明 *导入包 *函数 *变量 *语句和表达式 *注释 流程控制 1.顺序结构 2.选择结构  (1)if else if 和 e ...