入门

多线程C++程序是什么样子的?

它看上去和其它全部C++程序一样,一般是变量、类以及函数的组合。

唯一真正的差别在于某些函数能够并发执行,

当然。为了并发地执行函数,必须使用特定的函数以及对象来管理各个线程。

从hello world 開始

让我们从一个经典的样例開始:一个打印“Hello World.”的程序。一个很easy的在单线程中执行的Hello, World

程序例如以下所看到的。当我们谈到多线程时,它能够作为一个基准,

#include<iostream>

int main()
{
std::cout<<"hello world" ;
return 0;
}

这个程序所做的一切就是将“Hello World”写进标准输出流。

让我们将它与以下清单所看到的的简单的Hello,

Concurrent World程序做个比較,它启动了一个独立的线程来显示这个信息。

#include <iostream>
#include <thread> //① void hello() //②
{
std::cout << "Hello Concurrent World\n";
} int main()
{
std::thread t(hello); //③
t.join(); //④
}

<1>第一个差别是添加了#include<thread>。在标准C++库中对多线程支持的声明在此头文件里。

<2>其次,信息打印的代码被移动到了一个独立的函数中。这是由于每一个线程都必须具有一个初始函数,新线程的执

行在这里開始。对于应用程序来说,初始线程是main(),可是对于全部其它线程。thread对象t拥有新函数hello

()作为其初始函数。

<3>与直接写入标准输出或是从main()调用hello()不同,该程序启动了一个全新的线程来实现。初始线程始于main()

而新线程始于hello()。

<4>在新的线程t(hello)启动之后,初始线程(main)继续运行。假设它不等待新线程t(hello)结束再结束。就将自顾

自地继续执行到main()的结束。从而结束程序──有可能使新线程t(hello)还没有执行结束就结束程序。

这就是为什么

在这里调用join()的原因,这使调用线程(main)等待t(hello)运行完成,再结束初始线程(main)。

小结:

一般来说并不值得为了如此简单的任务而使用多线程,尤其是假设在这期间初始线程无所事事。但在一些情景下使用

多线程能够获得明白的收益。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

C++并发编程学习笔记&lt;1&gt; 入门的更多相关文章

  1. Java并发编程学习笔记

    Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...

  2. 并发编程学习笔记(15)----Executor框架的使用

    Executor执行已提交的 Runnable 任务的对象.此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节.调度等)分离开来的方法.通常使用 Executor 而不是显式地创建 ...

  3. 并发编程学习笔记(14)----ThreadPoolExecutor(线程池)的使用及原理

    1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

  4. 并发编程学习笔记(13)----ConcurrentLinkedQueue(非阻塞队列)和BlockingQueue(阻塞队列)原理

    · 在并发编程中,我们有时候会需要使用到线程安全的队列,而在Java中如果我们需要实现队列可以有两种方式,一种是阻塞式队列.另一种是非阻塞式的队列,阻塞式队列采用锁来实现,而非阻塞式队列则是采用cas ...

  5. 并发编程学习笔记(11)----FutureTask的使用及实现

    1. Future的使用 Future模式解决的问题是.在实际的运用场景中,可能某一个任务执行起来非常耗时,如果我们线程一直等着该任务执行完成再去执行其他的代码,就会损耗很大的性能,而Future接口 ...

  6. 并发编程学习笔记(12)----Fork/Join框架

    1. Fork/Join 的概念 Fork指的是将系统进程分成多个执行分支(线程),Join即是等待,当fork()方法创建了多个线程之后,需要等待这些分支执行完毕之后,才能得到最终的结果,因此joi ...

  7. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  8. 并发编程学习笔记(9)----AQS的共享模式源码分析及CountDownLatch使用及原理

    1. AQS共享模式 前面已经说过了AQS的原理及独享模式的源码分析,今天就来学习共享模式下的AQS的几个接口的源码. 首先还是从顶级接口acquireShared()方法入手: public fin ...

  9. 并发编程学习笔记(8)----ThreadLocal的使用及源码分析

    1. ThreadLocal的理解 ThreadLocal,顾名思义,就是线程的本地变量,ThreadLocal会为每个线程创建一个本地变量副本,使得使用ThreadLocal管理的变量在多线程的环境 ...

随机推荐

  1. dispatch_once认识分析

    dispatch_once为了确保代码运行一次 +(NSDateFormatter*)getDBDateFormat { static NSDateFormatter* format; static ...

  2. Binary Tree Inorder Traversal(转)

    Given a binary tree, return the inorder traversal of its nodes' values. For example: Given binary tr ...

  3. HDU 4917 Permutation

    意甲冠军: 序列p1.p2.p3--pn由1.2.3--n这些数字  现在给出一些条件pi<pj  部条件的排列的个数 思路: 非常easy想到用一条有向的线连接全部的pi和pj  那么就构成了 ...

  4. 刷牙LeetCode思考

    时间已经到了不自觉地,3在五月中旬.今天正式LeetCode自由181刷牙的问题.感觉,以提高他们的算法非常有帮助. 第一个主要的深搜索,广泛搜索,DP他已经掌握7788.也有自己写的代码格公式,使用 ...

  5. Cloudera impala简单介绍及安装具体解释

    一.Impala简单介绍 Cloudera Impala对你存储在Apache Hadoop在HDFS,HBase的数据提供直接查询互动的SQL.除了像Hive使用同样的统一存储平台,Impala也使 ...

  6. 学习英语每日一 On the house. 赠品

    tp=webp" alt=""> On the house. 免费赠送.我们之前学过请客能够说I'll buy you something. 事实上还有一种说法是I ...

  7. Android MotionEvent事故响应机制

    于android于.主要活动包括点击.按.拖累.滑动等操作,这些构成了Android事件响应,总体而言,,所有事件由例如以下三部分构成的基础: 按(action_down),搬家(action_mov ...

  8. javascript中间preventDefault与stopPropagation角色介绍

    preventDefault的作用是什么方法,它? 我们知道,例如,<a href="http://www.baidu.com">百度</a>,这是html ...

  9. Google大数据三篇著名论文----中文版

    Google File System中文版 Google Bigtable中文版      Google MapReduce中文版

  10. ThreadLocal的内存泄露(转)

    ThreadLocal的目的就是为每一个使用ThreadLocal的线程都提供一个值,让该值和使用它的线程绑定,当然每一个线程都可以独立地改变它绑定的值.如果需要隔离多个线程之间的共享冲突,可以使用T ...