线程就是,在同一程序同一时间内同意运行不同函数的离散处理队列。 这使得一个长时间去进行某种特殊运算的函数在运行时不阻碍其它的函数变得十分重要。 线程实际上同意同一时候运行两种函数,而这两个函数不必相互等待。

一旦一个应用程序启动。它仅包括一个默认线程。

此线程运行 main() 函数。 在
main()
中被调用的函数则按这个线程的上下文顺序地运行。

这种程序称为单线程程序。

反之,那些创建新的线程的程序就是多线程程序。 他们不仅能够在同一时间运行多个函数,并且这在现在多核盛行的时代显得尤为重要。 既然多核同意同一时候运行多个函数,这就使得对开发者对应地使用这样的处理能力提出了要求。

然而线程一直被用来当并发地运行多个函数,开发者现在不得不细致地构建应用来支持这样的并发。 多线程编程知识也因此在多核系统时代变得越来越重要。

新建线程里运行的那个函数的名称被传递到 boost::thread 的构造函数。 一旦上述演示样例中的变量
t 被创建。该 thread() 函数就在其所在线程中被马上运行。 同一时候在
main()
里也并发地运行该 thread()

为了防止程序终止,就须要对新建线程调用 join() 方法。


join()
方法是一个堵塞调用:它能够暂停当前线程。直到调用 join() 的线程执行结束。

这就使得
main() 函数一直会等待到 thread() 执行结束。

正如在上面的样例中看到,一个特定的线程能够通过诸如 t 的变量訪问,通过这个变量等待着它的使用
join()
方法终止。 可是,即使 t 越界或者析构了。该线程也将继续运行。 一个线程总是在一開始就绑定到一个类型为
boost::thread
的变量,可是一旦创建。就不在取决于它。

甚至还存在着一个叫 detach() 的方法,同意类型为
boost::thread 的变量从它相应的线程里分离。 当然了。像
join()
的方法之后也就不能被调用。由于这个变量不再是一个有效的线程。

不论什么一个函数内能够做的事情也能够在一个线程内完毕。 归根结底,一个线程仅仅只是是一个函数,除了它是同一时候运行的。 在上述样例中,使用一个循环把5个数字写入标准输出流。

为了减缓输出,每个循环中调用
wait() 函数让运行延迟了一秒。

wait() 能够调用一个名为
sleep() 的函数,这个函数也来自于 Boost.Thread,位于
boost::this_thread
名空间内。

#include<iostream>

#include<boost/thread.hpp>



using namespace std;



void threadFunc(){

    cout<<"hello boost threads!"<<endl;

}



void wait(int seconds)

{

  boost::this_thread::sleep(boost::posix_time::seconds(seconds));

}



void thread()

{

  for (int i = 0; i < 5; ++i)

  {

    wait(1);

    std::cout << i << std::endl;

  }

}



struct ThreadFunc2{

    void operator()(const int & id){

        cout<<"thread #"<<id<<"hello boost Threads from operator!";

    }

};



int main(){

    boost::thread t(threadFunc);

    t.join();



    boost::thread t2(ThreadFunc2(),2);

    t2.join();



    boost::thread t3(thread());

    t3.join();



    return 1;

}

编译后输出:

hello boost threads!

thread #2hello boost Threads from operator!

C++ Linux 多线程之创建、管理线程的更多相关文章

  1. C# 多线程的自动管理(线程池) 基于Task的方式

    C# 多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况:    1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应.这一般使用 ThreadPool(线程 ...

  2. Linux多线程实践(9) --简单线程池的设计与实现

    线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以 ...

  3. Linux多线程--使用信号量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10813469 信号量.同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过 ...

  4. Linux 多线程环境下 进程线程终止函数小结(转)

    pthread_kill: pthread_kill与kill有区别,是向线程发送signal.,大部分signal的默认动作是终止进程的运行,所以,我们才要用signal()去抓信号并加上处理函数. ...

  5. C#多线程学习(四) 多线程的自动管理(线程池)

    在多线程的程序中,经常会出现两种情况: 一种情况:   应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应                   这一般使用ThreadPo ...

  6. linux多线程学习笔记五--线程安全【转】

    转自:http://blog.csdn.net/kkxgx/article/details/7506085 版权声明:本文为博主原创文章,未经博主允许不得转载. 一,线程安全基础 一个函数被称为线程安 ...

  7. Linux多线程——使用互斥量同步线程

    前文再续,书接上一回,在上一篇文章: Linux多线程——使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两 ...

  8. Linux多线程--使用互斥量同步线程【转】

    本文转载自:http://blog.csdn.net/ljianhui/article/details/10875883 前文再续,书接上一回,在上一篇文章:Linux多线程——使用信号量同步线程中, ...

  9. linux多线程同步pthread_cond_XXX条件变量的理解

    在linux多线程编程中,线程的执行顺序是不可预知的,但是有时候由于某些需求,需要多个线程在启动时按照一定的顺序执行,虽然可以使用一些比较简陋的做法,例如:如果有3个线程 ABC,要求执行顺序是A-- ...

随机推荐

  1. 【51nod-1239&1244】欧拉函数之和&莫比乌斯函数之和 杜教筛

    题目链接: 1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 1244:http://www.51nod. ...

  2. jsoncpp 0.5 ARM移植

    1.下载jsonapp 0.5 https://github.com/open-source-parsers/jsoncpp 2.编译 platform 没有包含 arm 平台,需要把源码提取出来,独 ...

  3. 如何编写LVS对Real Server的健康状态检测脚本

    简介:Linux 虚拟服务器(Linux Virtual Server. LVS),是一个由章文松开发的自由软件.利用KVS可以实现高可用的.可伸缩缩的Web, Mail, Cache和Medial等 ...

  4. java并发基础(一)

    最近在看<java并发编程实战>,希望自己有毅力把它读完. 线程本身有很多优势,比如可以发挥多处理器的强大能力.建模更加简单.简化异步事件的处理.使用户界面的相应更加灵敏,但是更多的需要程 ...

  5. js 闭包范式概述

    在前几篇文章中我介绍过js的闭包,这一篇主要简单的介绍一下js中闭包的范式. 那么何谓闭包的范式呢? 首先回想一下闭包的概念,闭包是外部函数与函数内部之间通信的桥梁,通过对函数的返回,使得外部的函数能 ...

  6. onInterceptTouchEvent 与 onTouchEvent 分析与MotionEvent在ViewGroup与View中的分发

    onInterceptTouchEvent 与 onTouchEvent 分析与MotionEvent在ViewGroup与View中的分发        Notice:本文将紧接着 Android ...

  7. C# 中提取表中的某一项数据

  8. 硬件负载均衡F5和软负责均衡Nginx

    请直接搜索相关文章了解:http://www.ideadata.com.cn/wisdomAction/readWisdom.do?id=75   F5,硬件 优点:能够直接通过智能交换机实现,处理能 ...

  9. 【C++ Primer】用于大型程序的工具

    1. 异常处理 异常以类似于将实參传递给函数的方式抛出和捕获.异常可以是可传给非引用实參的随意实參的类型,这意味着必须可以复制该类型的对象. 当抛出一个表达式的时候,被抛出对象的静态编译时类型将决定异 ...

  10. UVA 10026 Shoemaker&#39;s Problem

    Shoemaker's Problem Shoemaker has N jobs (orders from customers) which he must make. Shoemaker can w ...