thread库使用摘要

​CentOS 7 安装Boost 1.55​ 没有生成libboost_thread-mt.so解决 阅读详情

和智能指针一样,thread库也已经被加入到标准了,为了照顾某些不是最新版本的C++编译器,这里还是以boost中的thread为例,其和标准thread几乎一样。

1. build使用boost::thread的代码时,要链接libboost_thread.so和libboost_systrem.so,注意确认库文件名,有时是libboost_thread-mt.so和libboost_systrem-mt.so

2. thread对象是不可拷贝的。如果需要将其放入容器中,一般采用两种方法:(1)使用move语义;(2)初始化一个指向它的智能指针,容器中保存智能指针

3. 线程睡眠

    boost::this_thread::sleep(boost::posix_time::seconds(2)); // 本线程睡眠2秒钟

4. 使用boost::mutex的lock和unlock方法时,要加上try-catch,确保顺利unlock

   // 由于临界区可能抛出异常,为了保证unlock被调用,要加上try-catch
   boost::mutex mu;
   try {
       mu.lock();
       std::cout << "critical section" << std::endl; // 临界区
       mu.unlock();
   } catch(...) {
       mu.unlock();
   }

5. 优先使用scoped_lock,让加锁和解锁自动化

   // 使用大括号,构造出一个作用域,将需要锁保护的操作放入其中,使用自动锁保护
   {
        boost::mutex mu;
        // 构造自动锁对象,在构造函数中完成加锁操作
        // 当退出作用域后,自动锁的析构函数被调用,在析构函数中完成解锁操作
        boost::mutex::scoped_lock lock(mu);
        std::cout << "critical section" << std::endl; // 临界区
   }

6. 创建线程

   void print_func(int x, const std::string& s) {
       std::cout << x << std::endl;
       std::cout << s << std::endl;
   }
  
   int x = 8;
   std::string s("Hello, world")
   
   boost::thread print_thread(print_func, x, s);

7. 线程等待

   print_thread.join(); // 等待线程print_thread执行完毕才返回
   print_thread.timed_join(boost::posix_time::secodes(10)); // 最多等待线程print_thread执行10秒,可以提前返回

8. 中断线程

   print_thread.interrupt();

9. 设置中断点

  boost::this_thread::interruption_point();

10. 启用/禁用中断

   boost::this_thread::interruption_enabled(); // 检测当前线程是否允许被中断
   boost::this_thread::disable_interruption类,其对象具有RAII性质,构造时禁用中断,析构时自动恢复
   boost::this_thread::restore_interruption类,构造时启用中断,析构时禁用中断

   {
       boost::this_thread::disable_interruption di; // 禁用中断
       // do sth
       boost::this_thread::interruption_point();    // 中断被禁用,中断点无效
       boost::this_thread::restore_interruption ri(di); // 启用中断
       // do sth
       boost::this_thread::interruption_point();    // 中断点有效,线程被中断
       // do sth, but we never get here
   }

11. 条件变量优先使用condition_variable_any,它能够适应更广泛的互斥量类型。boost库有个typedef,typedef boost::condition_variable_any boost::condition,所以可以直接使用boost::condition

12. 条件变量使用示例:

    // 生产者线程和消费者线程均可访问到的全局变量(相对于它们而言)
    boost::mutex mu;
    boost::condition_variable_any condi; // 等价于boost::condition condi;
    std::queue<std::string> q;

    // 消费者线程,q为队列
   {
        boost::mutex::scoped_lock lock(mu);
        while (q.empty()) {
            condi.wait(mu);
        }

        std::string s = q.front();
        std::cout << s << std::endl;
   }

   // 生产者线程
   {
       boost::mutex::scoped_lock lock(mu);
       std::string s("abc");
       q.push(s);
       condi.notify_one();
   }

13. 读写锁shared_mutex

        boost::shared_mutex sm;
    // 读锁定
    {
        boost::shared_lock<boost::shared_mutex> sl(sm);
        // do sth
    }


    // 写锁定
    {
        boost::unique_lock<boost::shared_mutex> ul(sm);
        // do sth
    }

14. 仅初始化一次

    static int g_count;
    void init_func() {
        std::cout << "This init_func function should be called only once" << std::endl;
        g_count = 8;
    }

    void init_func() {
        std::cout << "This init_func function should be called only once" << std::endl;
        g_count = 8;
    }

    boost::once_flag of = BOOST_ONCE_INIT;
    void call_func() {
        call_once(of, init_func);
    }

    int main() {
        boost::thread t1(call_func);
        boost::thread t2(call_func);
        boost::thread t3(call_func);

        t1.join();
        t2.join();
        t3.join();

        return 0;
    }

15. cout等流对象在多线程环境下要加锁,它们不是线程安全的

C++Boost库学习之thread库(一) 目录 1.thread库概述 2.类thread   ①类定义   ②使用例子 3.命名空间this_thread   ①空间内定义   ②使用例子 4.类thread_group   ①类定义   ②使用例子 1.thread库 ^   Boost.Thread允许在可移植C ++代码中使用多个执行线程和共享数据。它提供了用于管理线程本身的类和函数,以及用于在线程之间同步... 阅读详情

相关推荐

BOOST之Thread库学习

boost中thread库的学习

luguifang2011的专栏 1691

thread的使用

在上面的示例程序中有一个 bug,在主线程中依次创建出两个子线程,打印两个子线程的线程 ID,最后主线程执行完毕就退出了(主线程就是执行 main () 函数的那个线程)。如上我们在主线程中执行interact()这个交互函数,子线程执行文件下载的函数,当主线程执行完成后,不会立马退出程序和回收资源,程序会陷入阻塞,等待下载文件的子线程完成,才会退出程序。但是子线程对象中的任务函数会继续执行,当任务执行完毕之后join()会清理当前子线程的相关资源然后返回,同时,调用该函数的线程解除阻塞继续向下执行。

Thinking777的博客 357

VS2010 编译 boost thread库

简介boost中大部分算法在hpp中直接实现,因而直接引用头文件即可使用; 某些特殊的,例如thread库需要编译后才能调用,这里介绍thread库的编译方法。源码&&解压下载Boost源码。解压boost库目录,例如版本1.57解压后目录为d:\boost_1_57_0 编译bjam.exe进入d:\boost_1_57_0\tools\build\src\engine\目录下,执行build

bigbigtree 3028

fio安装和报错

fio是测量磁盘IO性能的重要工具之一,可以很好的测试IOPS。在进行性能测试的时候建议使用裸盘的方式进行测试,会得到比较真实的数据。 fio安装: yum install fio fio的卸载: yum remove fio 使用命令fio判断是否安装成功,显示报错: [root@localhost data]# fio fio: error while loading sha...

clever_wr的博客 7425

PT-Thread的使用教程

PT-Thread保姆级使用教程

负吾键来的博客 3865

RT-thread的MultiButton按键库的使用

CubeMX配置。

qq_52251819的博客 1224

Linux|操作系统运维|磁盘性能检测之fio和iostat的初步使用

有的时候,我们接手一个新的服务器的时候,需要了解该服务器的磁盘性能是否可靠,比如,磁盘是否有坏道,磁盘的读写性能是否能够符合我们将要部署的服务,例如数据库服务,如果该数据库是一个读写比较频繁也就是IO比较高的数据库,那么,该磁盘是否能够支持高IO呢? 针对以上需求,建议使用工具fio和iostat这两个工具

zsk_john的技术分享专用博客 2222

libboost_thread.so.1.58.0

libboost_thread.so.1.58.0,系统缺库的时候需要用到,ldd可以检测

C++ thread库

C++11中提供了thread线程库,它本质上和pthread库差不多,只不过被封装了,同时它还是可以跨平台的。

m0_61567378的博客 2198

( libboost.zip )

caffe中缺少的libboost库文件,libboost_date_time-vc140-mt-1_61.lib,libboost_filesystem-vc140-mt-1_61.lib

Frida实战:从adb连接到安卓设备参数加密Hook全流程解析

本文详细解析了使用Frida进行安卓应用动态分析的全流程。通过adb连接设备并部署Frida服务端,结合静态分析与动态Hook技术,精准定位并拦截关键函数,特别是针对参数加密等核心逻辑的实时监控与修改,为逆向分析与安全研究提供了高效实战方案。

weixin_29208077的博客 342

Boost::thread库的使用

Boost::thread库的使用2009/11/26Kagula  阅读对象本文假设读者有几下Skills[1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念。[2]熟悉C++开发,在开发工具中,能够编译、设置boost::thread库。  环境[1]Visual Studio 2005/2008 with SP1[2]b

lee353086的专栏 2万+

MATLAB实战:手把手教你用三频四步相移法搞定结构光三维重建(附完整代码)

本文详细介绍了如何使用MATLAB实现三频四步相移法进行高精度结构光三维重建。通过光栅图像预处理、相位计算、多频外差与相位解包裹等步骤,结合完整代码示例,帮助读者掌握从二维图像到三维点云的关键技术。该方法在工业检测和逆向工程中具有抗干扰能力强、高分辨率和鲁棒性等优势。

weixin_29201933的博客 338

Windows下C++使用thread时无法识别thread和mutex相关库的解决

问题描述 今天我在Windows下打算尝试C++多线程编程,在CLion上进行编码。CLion的C++编译器是正常的,以前也跑过好几个项目,使用其他STL库函数也正常,唯独使用thread时报无法识别的错,所有thread都划上了红线。如下图所示: 其他错误信息包括但不限于: thread未定义 No member named ‘thread’ in namespace ‘std’; ‘thread’ undefined 找不到thread mutex contiditional_variable未定义

GhostLWB的博客 1万+

博图V16与840D sl数控系统PLC编程实战指南

本文为西门子840D sl数控系统的PLC编程实战指南,详细介绍了如何使用博图V16软件配置编程环境。内容涵盖从项目创建、核心程序块(如DB、FB)解析到OB1主循环编程的完整流程,并提供了高级调试技巧与联调避坑指南,帮助工程师快速上手并高效完成系统集成与逻辑控制。

weixin_29193259的博客 527

408王道考研【数据结构】思维导图(章节详细可下载xmind文件)

由于图片太多,不一一放上来了,还有部分章节【查找、排序、B树B+树等】在百度网盘,可以关注我的公众号领取【完整的图片+xmind文件】,如想要获取xmind文件的同学可以关注我的个人公众号“小柒很爱喵”,回复“数据结构导图”,可获得以上导图原图和xmind文件(可修改导图内容、查看导图隐藏的笔记与备注,即上图带杠杠的地方是我进一步助于理解的解释)。 希望对你们...

weixin_41950078的博客 7985

vs2015安装boost并使用thread库

文章目录1. 下载并编译对应的Boost版本备注1: 编译命令详解备注2:一些示例2. 在vs2015中测试编译好的boost库3. 编写多线程测试程序附:vs2010编译boost thread库 1. 下载并编译对应的Boost版本 Boost的15个库(包括data_time,regex,program_options、test、thread等)必须编译成静态库或动态库后才能使用。对于官网下载的Boost库,需要编译成我们使用的版本才可以供vs调用。 这里以编译供vs2015使用的boost库为例

sinat_38368658的博客 1053

uniapp - [全端兼容] 详解实现国际化多语言切换全流程及示例,全部页面中英文多语言随意切换即时生效,语言切换全项目立即变化可自定义新增各国其他语言,uniApp实现中英文语言切换完整源码教程!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp多语言实现,uni-app项目使用多语言切换功能,中英文切换,uniapp实现中英文语言切换,uniApp实现国际化多语言切换,中文英文之间的更换,Uniapp使用什么插件能支持多种语言,退出后重启依然能让语言保留,设置可切换中英文,uniapp国际化页面双语/顶部导航双语/根据系统语言双语,标题栏文字原生底部菜单tabbar怎么改,使用vue-i18n国际化多国语言,全平台i18n插件,

🏆 前端领域优质创作者 1万+

在 RT-Thread 上使用单色屏 UI 库 - U8G2

基于 RT-Thread 使用 U8G2 驱动单色屏

随便转转 1983

验证方法、符合性方法与设计保证的关系

未来,随着适航标准和工程实践的不断演进,验证与符合性方法将持续优化,以应对日益复杂的系统设计需求。设计保证过程中的验证活动具有双重作用,既用于设计过程的质量控制和风险管理,又作为适航符合性方法的重要支持材料。在未来的航空电子系统开发中,进一步优化设计保证与验证活动的协同作用,将有助于应对日益复杂的工程挑战,推动航空安全技术的发展。为了全面理解这二者之间的关系,本章将系统说明设计保证过程中的验证活动如何既服务于设计保证,又作为符合性方法中的核心证明材料。最终,通过功能测试和环境测试验证硬件的实际性能。

qq_41854911的博客 554

OpenClaw 从新手到中级完整教程【完整 持续更新版】

OpenClaw(曾用名 ClawdBot/Moltbot)是 2026 年最火的开源 AI Agent 项目,GitHub 已获得超过 68,000 星标。它不是普通的聊天机器人,而是一个真正能够执行任务的个人 AI 助理。

FeelTouch Labs 3114

muduo库Thread类剖析

muduo库中的Thread类集合了所有线程的操作,其中还运用了线程安全的观察者模式。 运用shared_ptr和weak_ptr做到了生命周期的管理。 代码加注释如下: Thread.h #ifndef MUDUO_BASE_THREAD_H #define MUDUO_BASE_THREAD_H #include #include #include #include #in

FreeeLinux's blog 2866

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RT-Thread cJSON库的使用

RT-Thread包含cJSON包,但是并没有教程,结合网上的资料,以组成一下json字符串为例,记录一下使用笔记。 { "datastreams": [{ "id": "location", "datapoints":[{ "value":{ "lat": 0, "lon": 0 } }] }] } cJSON库所有数据都用cJSON指针来保存。 cJSON对象使用大括号包着,数组使用中括号包着,字符串对象用双引号包着,数值则不用。 使用cJS

ShineRoyal 3661

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于HAL库使用RT-Thread nano官方的移植

让开发板上面的RGB蓝色灯以1s的频率闪烁,while(1)

XTQQQF的博客 1730

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++多线程编程到底该怎么学?从thread库、this_thread到mutex,这些核心组件你真的掌握了吗?

本文围绕C++多线程编程展开,介绍thread库、this_thread命名空间、mutex相关类。涵盖线程创建、操作,线程ID获取,线程让步、休眠等功能,还阐述互斥锁特性、用途及不同类型锁的使用,通过代码示例展示其应用与效果。

羑悻的博客. 2373
上一篇: 智能指针使用摘要
下一篇: 使用gdb调试多线程死锁
NewSimic
博客等级 码龄17年 0粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值