c++并发编程之创建线程

时间:2022-09-03 18:14:01

以boost为例。boost::thread有两个构造函数: 
(1)thread():构造一个表示当前执行线程的线程对象; 
(2)explicit thread(const boost::function0<void>& threadfunc): 
     boost::function0<void>可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入。

方法1:通过无参数的函数创建线程

#include <iostream>
#include <boost/thread.hpp> void Hello() {
// 睡眠一秒以模拟数据处理。
boost::this_thread::sleep(boost::posix_time::seconds()); std::cout << "Hello, World!" << std::endl;
} int main() {
// 创建一个线程对象,注意函数 Hello 将立即运行。
boost::thread hello_thread(Hello); // 等待线程结束。
// 否则线程还没执行(完),主程序就已经结束了。
hello_thread.join(); return ;
}

方法2:通过带参数的函数创建线程

#include <iostream>
#include <boost/thread.hpp> void Hello(const char* what) {
// 睡眠一秒以模拟数据处理。
boost::this_thread::sleep(boost::posix_time::seconds()); std::cout << "Hello, " << what << "!" << std::endl;
} int main() {
boost::thread hello_thread(Hello, "World");
// 等价于使用 bind:
// boost::thread hello_thread(boost::bind(&Hello, "World")); hello_thread.join(); return ;
}

方法3:通过一个函数对象,即仿函数(functor)创建线程

#include <iostream>
#include <boost/thread.hpp> class Hello {
public:
void operator()(const char* what) {
boost::this_thread::sleep(boost::posix_time::seconds());
std::cout << "Hello, " << what << "!" << std::endl;
}
}; int main() {
Hello hello; // 方式一:拷贝函数对象。
boost::thread hello_thread(hello, "World");
hello_thread.join(); // 方式二:不拷贝函数对象,通过 boost::ref 传入引用。
// 用户必须保证被线程引用的函数对象,拥有超出线程的生命期。
// 比如这里通过 join 线程保证了这一点。
boost::thread hello_thread_ref(boost::ref(hello), "World");
hello_thread_ref.join(); return ;
}

方法4:通过一个成员函数创建线程

与前例不同之处在于,需要以 bind 绑定 this 指针作为第一个参数。

#include <iostream>
#include <boost/thread.hpp> class Hello {
public:
Hello() {
boost::thread hello_thread(boost::bind(&Hello::Entry, this, "World"));
hello_thread.join();
} private:
// 线程函数
void Entry(const char* what) {
boost::this_thread::sleep(boost::posix_time::seconds());
std::cout << "Hello, " << what << "!" << std::endl;
}
}; int main() {
Hello hello;
return ;
}

tip: 关于thread::join() 和thread::detach(), 参见https://www.cnblogs.com/zhanghu52030/p/9166526.html

c++并发编程之创建线程的更多相关文章

  1. Java并发编程系列-&lpar;2&rpar; 线程的并发工具类

    2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了 ...

  2. Java并发编程&lpar;01&rpar;:线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  3. JAVA并发编程学习笔记------线程的三种创建方式

    创建线程一般有如下几个方式: 1. 通过继承Thread类来创建一个线程: /** * 步骤1:定义一个继承Thread类的子类 * 步骤2:构造子类的一个对象 * 步骤3:启动线程: * */ pu ...

  4. Python并发编程之创建多线程的几种方法(二)

    大家好,并发编程 进入第二篇. 今天的内容会比较基础,主要是为了让新手也能无障碍地阅读,所以还是要再巩固下基础.学完了基础,你们也就能很顺畅地跟着我的思路理解以后的文章. 本文目录 学会使用函数创建多 ...

  5. Python3 与 C&num; 并发编程之~ 线程篇

      2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...

  6. Java并发编程:Java线程池核心ThreadPoolExecutor的使用和原理分析

    目录 引出线程池 Executor框架 ThreadPoolExecutor详解 构造函数 重要的变量 线程池执行流程 任务队列workQueue 任务拒绝策略 线程池的关闭 ThreadPoolEx ...

  7. 【Java并发编程六】线程池

    一.概述 在执行并发任务时,我们可以把任务传递给一个线程池,来替代为每个并发执行的任务都启动一个新的线程,只要池里有空闲的线程,任务就会分配一个线程执行.在线程池的内部,任务被插入一个阻塞队列(Blo ...

  8. Java并发编程&lpar;02&rpar;:线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

  9. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

随机推荐

  1. 二胎上位之路:html5报表和原生报表的笑尿撕逼

    前段时间,小编和我们移动端产品经理之间发生了一场罕见的撕逼大战. (看到撕逼二字,估计读者朋友们来劲了,呵呵呵……) 事情起因是这样的.小编基于对客户需求以及同行产品的了解,发了一篇关于报表在各种屏幕 ...

  2. 关于Spring

    Jetty默认采用NIO结束在处理I/O请求上更占优势,在处理静态资源时,性能较高.Tomcat默认采用BIO处理I/O请求,在处理静态资源时,性能较差. 依赖注入的意义:让组件依赖于抽象,当组件要与 ...

  3. Maven&plus;druid&plus;MyBatis&plus;Spring&plus;Oracle&plus;Dubbo开发环境搭建

    1.开发工具使用: MyEclipse或Eclipse,数据库使用Oracle.需要用到的软件有Zookeeper(注册中心),Tomcat(Web容器)和Maven(包管理). 2.初始环境配置: ...

  4. 缓存插件 EHCache

    EHCache是来自sourceforge(http://ehcache.sourceforge.net/)的开源项目,也是纯Java实现的简单.快速的Cache组件. 下载jar包 Ehcache ...

  5. 编译android源码官方教程&lpar;5&rpar;编译完之后刷机、编译fastboot

    Running Builds IN THIS DOCUMENT Building fastboot and adb Booting into fastboot mode Unlocking the b ...

  6. Linux下常用软件

    一, vmtool安装, 进入桌面就后,如果没有看到VMware Tools光盘, 请点击VMware Station菜单栏上的“虚拟机”,然后选择“安装VMware Tools”,就可以在桌面上以看 ...

  7. HDU 4497 GCD and LCM(分解质因子&plus;排列组合)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ...

  8. &lbrack;Java&rsqb; HttpClient有个古怪的stalecheck选项

    打开stale check会让每次http请求额外消耗15毫秒.而且stalecheck选项缺省是打开的. 这有必要吗???? 在局域网里面调用web api service的时候会死人的. http ...

  9. Centos7 下Jenkins 安装

    前言:什么是Jenkins? Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能. 一.下载 wg ...

  10. 百度翻译cs文件英文注释

    原由:本人英语烂,没办法看不懂国外的代码注释!只能借助其他手段来助我一臂之力了. 虽然翻译内容不是很准确,但好过什么都看不懂的强. 对吧?! 代码有点乱有用的园友自个整理一下吧! 最近没时间所以翻译后 ...