【BOOST C++ 线程】boost::thread库的基本使用方法总结

news2024/11/28 14:30:55

一、说明

        boost::thread的六种使用方法总结,本文初步介绍线程的函数、构造、执行的详细解释。

二、boost::thread的几个函数

函数功能
join()让主进程等待子线程执行完毕后再继续执行
get_id()获得线程的 id 号
detach()标线程就成为了守护线程,驻留后台运行
bool joinable()是否已经启动,为 join()

        thread::join()是个简单暴力的方法,主线程等待子进程期间什么都不能做,一般情形是主线程创建thread object后做自己的工作而不是简单停留在join上。
        thread::join()还会清理子线程相关的内存空间,此后thread object将不再和这个子线程相关了,即thread object不再joinable了,所以join对于一个子线程来说只可以被调用一次,为了实现更精细的线程等待机制,可以使用条件变量等机制。

        1、可会合(joinable):这种关系下,主线程需要明确执行等待操作,在子线程结束后,主线程的等待操作执行完毕,子线程和主线程会合,这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程。在主线程的线程函数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕,进入终止态,也必须执行会合操作,否则,系统永远不会主动销毁线程,分配给该线程的系统资源也永远不会释放。

        2、相分离(detached):表示子线程无需和主线程会合,也就是相分离的,这种情况下,子线程一旦进入终止状态,这种方式常用在线程数较多的情况下,有时让主线程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序,是很困难或不可能的,所以在并发子线程较多的情况下,这种方式也会经常使用。

三、 构造

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

#include <boost/thread/thread.hpp> 
#include <iostream> 
  
void hello() 
{ 
        std::cout << 
        "Hello world, I''m a thread!" 
        << std::endl; 
} 
  
int main(int argc, char* argv[]) 
{ 
        boost::thread thrd(&hello); 
        thrd.join(); 
        return 0; 
}

执行结果: 

  

第二种情况:类重载operator()构成的函数创建线程

#include <boost/thread/thread.hpp> 
#include <boost/thread/mutex.hpp> 
#include <iostream> 
  
boost::mutex io_mutex; 
  
struct count 
{ 
        count(int id) : id(id) { } 
        
        void operator()() 
        { 
                for (int i = 0; i < 10; ++i) 
                { 
                        boost::mutex::scoped_lock 
                        lock(io_mutex); 
                        std::cout << id << ": " 
                        << i << std::endl; 
                } 
        } 
        
        int id; 
}; 
  
int main(int argc, char* argv[]) 
{ 
        boost::thread thrd1(count(1)); 
        boost::thread thrd2(count(2)); 
        thrd1.join(); 
        thrd2.join(); 
        return 0; 
} 

运算结果: 

 第三种情况:在类内部对static函数创建线程

#include <boost/thread/thread.hpp>
#include <iostream> 
class HelloWorld
{
public:
 static void hello()
 {
      std::cout <<
      "Hello world, I''m a thread!"
      << std::endl;
 }
 static void start()
 {
  
  boost::thread thrd( hello );
  thrd.join();
 }
 
}; 
int main(int argc, char* argv[])
{
 HelloWorld::start();
 
 return 0;
} 

        注意:在这里start()和hello()方法都必须是static方法。因为static方法要比main方法提前加载,所以static方法不能调用一般方法,进一步说,static方法无法调用比它晚加载的方法,切记。 调用时用 HelloWorld::start(),说明start在定义类的时候就已经ready,无需在实例化后再调用。

第四种情况:使用boost::bind函数创建线程

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream> 
#include <boost/function.hpp>
class HelloWorld
{
public:
    void hello()
    {
        std::cout <<
            "Hello world, I''m a thread!"
            << std::endl;
    }
    void start()
    {
        boost::function0< void> f = boost::bind(&HelloWorld::hello, this);
        //或boost::function<void()> f = boost::bind(&HelloWorld::hello,this);
        boost::thread thrd(f);
        thrd.join();
    }

};
int main(int argc, char* argv[])
{
    HelloWorld hello;
    hello.start();
    return 0;
}

1)定义函数指针 boost::function0< void> f 

2)该指针与HelloWorld::hello函数绑定, boost::bind(&HelloWorld::hello, this);

3)线程与函数指针绑定 boost::thread thrd(f);

4)按照常规,将对象实例化后,调用类函数。

运算结果: 

第五种情况:在Singleton模式内部创建线程

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream> 
class HelloWorld
{
public:
 void hello()
 {
    std::cout <<
    "Hello world, I''m a thread!"
    << std::endl;
 }
 static void start()
 {
  boost::thread thrd( boost::bind  
                   (&HelloWorld::hello,&HelloWorld::getInstance() ) ) ;
  thrd.join();
 }
 static HelloWorld& getInstance()
 {
  if ( !instance )
      instance = new HelloWorld;
  return *instance;
 }
private: 
 HelloWorld(){}
 static HelloWorld* instance;
 
}; 
HelloWorld* HelloWorld::instance = 0; 
int main(int argc, char* argv[])
{
 HelloWorld::start();
 return 0;
} 

        此例将类对象实例化放在类内部函数中,因此无需显式实例化,就可以调用类内函数 。值得研究消化。

第六种情况:在类外用类内部函数创建线程

#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <string>
#include <iostream> 
class HelloWorld
{
public:
 void hello(const std::string& str)
 {
        std::cout <<str<< std::endl;
 }
}; 
  
int main(int argc, char* argv[])
{ 
 HelloWorld obj;
 boost::thread thrd( boost::bind(&HelloWorld::hello,&obj,"Hello 
                               world, I''m a thread!" ) ) ;
 thrd.join();
 return 0;
} 

线程如何带参数定义?本例就是参考方法! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【项目实战:核酸检测平台】第二章 大卸八块

本章目标 完成项目架构设计和数据库结构设计 重点&#xff1a;全是重点 文章目录本章目标总体设计&#xff08;架构设计&#xff09;技术选型部署结构设计工程文档结构设计第一步&#xff1a;项目和模块命名第二步&#xff1a;约定项目工程文件内容第三步&#xff1a;设计文档…

Hadoop高可用环境搭建-HDFSNameNode高可用搭建、Yarn高可用搭建

本文环境搭建的前提条件&#xff1a;JDK、Zookeeper、Hadoop完全分布式环境搭建完成。如果未满足条件且不会搭建&#xff0c;可以前往博主的主页搜索相关文章进行搭建。 目录 一、HDFSNameNode高可用搭建 二、 Yarn高可用搭建 本文主节点hostname&#xff1a;master&#xff0c…

安装semantic segmentation editor

两天啊&#xff0c; 整整两天&#xff0c;知道这两天我是怎么过的吗&#xff1f;&#xff1f;1 步骤概述&#xff08;以下命令行都是在管理员条件下执行&#xff09;1.1 安装choco1.2 安装meteor1.3 安装semantic segmentation editor2过程3 我还是用Ubuntu安装过3.1Window安装…

【Mysql】主从一致

【Mysql】主从一致&#xff08;一&#xff09;主从复制【1】什么是主从复制【2】为什么需要主从复制【3】mysql复制原理【4】具体步骤【5】mysql主从形式【6】具体操作过程&#xff08;1&#xff09;首先在虚拟机服务器上安装mysql&#xff0c;进行简单的配置&#xff08;2&…

力扣(LeetCode)38. 外观数列(C++)

双指针模拟 初始字符串 sss 已给定&#xff0c;根据 sss 构造下一个外观数列 ttt &#xff0c;构造完毕&#xff0c; ststst &#xff0c;循环 n−1n-1n−1 次&#xff0c;构造出一个外观数列。 构造步骤 : 令 jjj 指向当前元素 &#xff0c; kkk 从 jjj 往右&#xff0c;记录…

新库上线 | CnOpenData招聘公司基本信息扩展数据

招聘公司基本信息扩展数据 一、数据简介 线上招聘是指各公司将其岗位需求、工作地点能力要求和薪酬等招聘信息发布在互联网上&#xff0c;供求职者参考&#xff0c;以线上的方式进行招聘。线上招聘网站是通过互联网相关技术&#xff0c;集结这些线上招聘信息&#xff0c;帮助雇…

Linux下自动删除过期备份和自动异地备份的脚本

每天自动删除过期备份 首先编写一个简单的Shell脚本DeleteExpireBackup.sh&#xff1a; 1 2 3 4 5 6 7 #!/bin/bash # 修改需要删除的路径 location"/database/backup/" # 删除最后修改时间为30天以前的备份文件夹 find $location -mtime 30 -type d | xargs rm …

3dmax渲染大图有斑点怎么办?

嗨喽大家好&#xff0c;经常有后台私信问&#xff1a;3dmax渲染大图老是有斑点怎么办&#xff1f;而且斑点有白色的&#xff0c;还有绿色、黑色甚至彩色。怎么去除这些斑点呢&#xff1f; 其实以上的常见的斑点问题&#xff0c;大部分是灯光设置的问题。今天我们便来盘点下下面…

第二章:字节码指令集与解析案例

一、概述执行模型字节码与数据类型字节码指令分类加载与存储指令局部变量压栈指令常量入栈指令出栈装入局部变量表指令算术运算指令代码举例一代码举例二代码举例三&#xff1a;i 和 i 的区别比较指令的说明类型转换指令宽化类型转换(Widening Numeric Conversions)窄化类型转换…

指纹浏览器是什么?可以用来解决跨境电商的什么问题?

如果你是跨境电商中的一员&#xff0c;那我相信你肯定不陌生指纹浏览器吧&#xff01;毕竟指纹浏览器可以说是每个跨境人必备的工具了&#xff0c;更别说它的一系列功能简直是为跨境电商商家量身打造的&#xff01; 龙哥作为跨境老手&#xff0c;对指纹浏览器不要太熟悉&#x…

葡萄糖-顺铂Glucose-cisplatin|葡萄糖-聚乙二醇-顺铂cisplatin-PEG-Glucose

葡萄糖-顺铂Glucose-cisplatin|葡萄糖-聚乙二醇-顺铂cisplatin-PEG-Glucose 中文名称&#xff1a;葡萄糖-顺铂 英文名称&#xff1a;Glucose-cisplatin 别称&#xff1a;生物素修饰葡萄糖&#xff0c;生物素-葡萄糖 PEG接枝修饰葡萄糖 葡萄糖-聚乙二醇-顺铂 cisplatin-PE…

Go:命令行参数解析包 flag 简介

文章目录示例运行小结在 Golang 程序中有很多种方法来处理命令行参数。简单的情况下可以不使用任何库&#xff0c;直接处理 os.Args&#xff1b;其实 Golang 的标准库提供了 flag 包来处理命令行参数&#xff1b;还有第三方提供的处理命令行参数的库&#xff0c;比如 Pflag 等。…

【附源码】计算机毕业设计JAVA研究生推免系统

【附源码】计算机毕业设计JAVA研究生推免系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JAVA myba…

期货开户手机APP有哪些?

一、文华随身行 随身行是文华财经旗下APP软件&#xff0c;提供行情、图表、交易、行情讨论等综合服务。随身行是主流的期货交易软件&#xff0c;已接通全国139家期货公司 不过目前使用文华随身行APP是需要付费的&#xff0c;是直接向软件公司付费&#xff0c;与期货公司无关&…

2022 裁员风潮着实有点大,席卷全球~

近期无论国内外&#xff0c;裁员新闻接连不断&#xff0c;这次裁员风&#xff0c;给人的感觉&#xff0c;像是全球所有公司达成了 “某种协议”&#xff0c;行动上高度一致&#xff0c;开始接二连三的裁员&#xff0c;以往每年各个公司都有裁员&#xff0c;只是比例很小&#x…

【SpringBoot】SpringBoot+SpringSecurity+CAS实现单点登录

文章目录一.CAS的概述1.SSO2.CAS3.概念二.CAS的流程三.CAS服务端部署1.下载地址2.源码打包3.部署运行4. java.io.FileNotFoundException: \etc\cas\thekeystore (系统找不到指定的文件。)四.CAS的定制1.定制数据源2.兼容 HTTP3.定制登录页五.SpringBoot集成CAS1.工程创建2.导入…

2022年程序员“生存报告”出炉,仅23%月薪不足1万,你在什么段位?

转眼2022年仅剩2个月&#xff0c;在充满未知的这一年&#xff0c;程序员群体的职场现状如何&#xff1f; 近日&#xff0c;拉勾招聘数据研究院对程序员群体开展深度调研后&#xff0c;发布了一份《2022程序员群体职场洞察报告》&#xff08;以下简称报告&#xff09;&#xff…

深入理解 MultipartFile 处理文件

在Java中处理文件向来是一种不是很方便的操作&#xff0c;然后随着Spring框架的崛起&#xff0c;使用Spring框架中的MultipartFile来处理文件也是件很方便的事了&#xff0c;今天就为大家带来剖析MultipartFile的神秘面纱。MultipartFile本身并没有很复杂的结构&#xff0c;也正…

DBCO点击试剂特点:DBCO-PEG12-OH,DBCO-PEG12-Tos,DBCO-TCO

DBCO 试剂是一类点击化学标记试剂&#xff0c;含有非常活泼的 DBCO&#xff08;&#xff08;二苯并环辛炔&#xff09;基团&#xff0c;DBCO 试剂可以通过无铜点击化学与叠氮化物标记的分子或生物分子发生反应。DBCO 点击化学可以在水性缓冲液中运行&#xff0c;也可以在有机溶…

pyinstaller打包python脚本为exe可执行文件实例:错误排查小脚本

根据TIOBE全球编程语言排名&#xff0c;python是目前世界排名第一的编程语言。考虑到代码及数据的保密性&#xff0c;以及其他人电脑上可能没有装python环境&#xff0c;因此我们需要将自己编写的python脚本打包成exe格式的可执行文件发送给其他人使用。小编推荐一款名为pyinst…