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

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

此线程运行 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. vijos p1881 线段树

    题意:点我 我就想问,现在换代码风格还来得及吗? 2015-05-19:线段树进一步加强,看来不用换风格了 维护左右节点左右端颜色和长度即可 #include<cstdio> #inclu ...

  2. codevs 1052 地鼠游戏 优先队列

    1052 地鼠游戏 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://www.codevs.cn/problem/1052/ Descriptio ...

  3. 【原】使用Spring自带的JdbcTemplate。

    使用Spring自带的JdbcTemplate,可以简化对数据库的操作,用起来十分方便.通过一下几个步骤的配置,即可以使用JdbcTemplate. (1)配置好Spring的数据源,加入mysql驱 ...

  4. 利用.bat文件快速设置IE代理与清除IE代理

    http://www.duoluodeyu.com/2009/17.html 设置IE代理.bat文件原文:将下面红色文字复制保存为.bat文件即可. 复制后将蓝色字体部分改成你要设置的代理服务器地址 ...

  5. systemtap 用户态调试2

    [root@localhost ~]# cat user.stpprobe process(@1).function(@2){print_ubacktrace();exit();} session 1 ...

  6. 查找(二)简单清晰的B树、Trie树具体解释

    查找(二) 散列表 散列表是普通数组概念的推广.因为对普通数组能够直接寻址,使得能在O(1)时间内訪问数组中的任何位置.在散列表中,不是直接把keyword作为数组的下标,而是依据keyword计算出 ...

  7. 使用EF Model First创建edmx模型,数据库有数据的情况下,如何同时更新模型和数据库

    使用"EF Model First",我们可以很直观地在edmx文件中创建数据模型,并根据模型生成数据库,整个过程快速而高效.可当数据库中有了一定的数据量,同时,可能需要对模型中字 ...

  8. [转载] 关于matlab GUI的一点心得

    转载自 落落轻尘 [Fig文件方式,即使用菜单File->New->GUI来设计界面] 首先值得注意的是,在低版本matlab上制作的含GUI的m文件一般不能在高版本的matlab上面运行 ...

  9. Android SDK目录及版本号区别

    来自:http://www.2cto.com/kf/201604/496917.html 今天又有人问Tools,Build-Tools,Platform-tools有什么区别,是干嘛的? 现在对SD ...

  10. 在 Sublime Text 2 下开启 Vim 模式

    緣由 由於在 Sublime Text 2 下操作時會想起 Vim 下的鍵盤操作.一時興起在網絡上找了下,發現 Sublime Text 2 是支持類似 Vim 的鍵盤操作的.在此分享下配置過程. 打 ...