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

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

此线程运行 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. [Agc002E]Candy Piles

    [Agc002E]Candy Piles 题目大意 有\(n\)个数,两人轮流操作,可以做以下操作之一: 删掉一个最大的数 将所有数-1 最后取没的人输,问先手是否必胜? 试题分析 直接决策不知道选哪 ...

  2. UVALive 5058 Counting BST 数学

    B - Counting BST Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...

  3. Unity3D中的UnitySendMessage方法的使用

    UnitySendMessage(“string”,“string”, ***),这是方法,我们至少需要传入两个参数,第一个参数为unity中的一个gameobject名称,第二个参数为这个gameo ...

  4. JTAG Level Translation

    http://www.freelabs.com/~whitis/electronics/jtag/ One of the big issues in making a JTAG pod is leve ...

  5. Javascript 面向对象编程(一):封装(转载)

    Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...

  6. D-U-N-S申请流程

    1.打开D-U-N-S官网 http://fedgov.dnb.com/webform 图一 2.占击页面的“Click here to request your ......” (如图一红框所示)进 ...

  7. Monotouch/WCF: How to consume the wcf service without svcutil

    Becuase monotouch compile to native code, so it has some limitation such as dynamic invoke is not al ...

  8. MVC之Ajax如影随行

    一.Ajax的前世今生 我一直觉得google是一家牛逼的公司,为什么这样说呢?<舌尖上的中国>大家都看了,那些美食估计你是百看不厌,但是里边我觉得其实也有这样的一个哲学:关于食材,对于种 ...

  9. 通过扩展jQuery UI Widget Factory实现手动调整Accordion高度

    □ 实现Accordion高度一致 <head> <meta name="viewport" content="width=device-width&q ...

  10. python测试开发django-9.使用navicat连接mysql

    前言 navicat 是一个连接数据库的可视化工具,可以连接mysql和oracle做一些简单增删改查,对于初学者来说非常方便的 navicat安装 navicat版本比较多,分享一个我经常用的版本 ...