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

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

此线程运行 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. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  2. 【洛谷】3953:逛公园【反向最短路】【记忆化搜索(DP)统计方案】

    P3953 逛公园 题目描述 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条 ...

  3. ZOJ 3235 Prototype

    Prototype Time Limit: 1 Second      Memory Limit: 32768 KB Prototype is a 3D game which allow you to ...

  4. Qt线程外使用Sleep

    一:方法1 QTime t; t.start(); while(t.elapsed()<1000){     QCoreApplication::processEvents();} 二:方法2 ...

  5. JavaMail_测试编写

    @Test public void test1() throws Exception{ // import java.util.Properties; // import javax.mail.Add ...

  6. shell中set的用法(转)

    使用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性. 在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性, 不带任何参数的set命令将显 ...

  7. GDB 调试PYTHON

    http://www.cnblogs.com/dkblog/p/3806277.html

  8. VC6 下 libpng 库的编译与初步使用

      VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 ...

  9. jquery的each函数的用法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Android中怎样调用拨打电话?

    Android系统原本就为手机设计,所以,在android系统中的不论什么App中,仅仅要愿意,拨打指定电话很方便. 核心就是使用Intent跳转,指定请求Action为Intent.ACTION_C ...