BOOST-OSCHINA社区的一些经典C/C++例子

Boost(1):Boost库简介及安装 1. Boost库介绍 Boost是一个功能强大、构造精巧、跨平台、开源并且完全免费的C++程序库,在1998年由Beman G.Dawes发起倡议并建立。使用了许多现代C++编程技术,内容涵盖字符串处理、正则表达式、容器与数据结构、并发编程、函数式编程、泛型编程、设计模式实现等许多领域,极大地丰富了C++的功能和表现力,能够使C++软件开发更加简洁、优雅、灵活和高效。 Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。大部分Boost库功能的使用之需要包括相应的头文件即可,少数需要连接库。 阅读详情

1. 一个简单的mutex, condition实现, 用于在win平台下替代boost.mutex和boost.condition. 

实际中应该私有化拷贝构造函数和重截赋值操作, 以防拷贝或赋值. 

condition.h

//
// condition.h
// ~~~~~~~~~~~
//
// Copyright (c) 2011 Jack (jack.wgm@gmail.com)
//
 
#ifndef __CONDITION_H__
#define __CONDITION_H__
 
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
 
#include "mutex.h"
 
class condition
{
public:
   condition()
      : m_event(NULL)
   {
      m_event = CreateEvent(NULL, FALSE, FALSE, NULL);
   }
   virtual ~condition()
   {
      if (m_event)
         CloseHandle(m_event);
   }
 
public:
   inline void wait()
   {
      do_wait(INFINITE);
   }
 
   inline void wait(mutex::scoped_lock& lock)
   {
      if (lock.is_relocked())
         lock.unrelock();
      HANDLE semaphore = CreateSemaphore(NULL, 1, 1, NULL);
      WaitForSingleObject(semaphore, INFINITE);
      lock.attach_semaphore(semaphore);
      lock.unlock();
      do_wait(INFINITE);
      lock.lock();
   }
 
   inline bool timed_wait(DWORD millisec)
   {
      return do_wait(millisec);
   }
 
   inline void timed_wait(mutex::scoped_lock& lock, DWORD millisec = INFINITE)
   {
      if (lock.is_relocked())
         lock.unrelock();
      HANDLE semaphore = CreateSemaphore(NULL, 1, 1, NULL);
      WaitForSingleObject(semaphore, INFINITE);
      lock.attach_semaphore(semaphore);
      lock.unlock();
      do_wait(millisec);
      lock.lock();
   }
    
   inline void notify()
   {
      SetEvent(m_event);
   }
 
protected:
   inline bool do_wait(DWORD millisec)
   {
      DWORD ret = WaitForSingleObject(m_event, millisec);
      if (ret == WAIT_OBJECT_0)
         return true;
      if (ret == WAIT_TIMEOUT)
         return false;
      return false;
   }
 
protected:
   HANDLE m_event;
};
 
#endif // __CONDITION_H__

mutex.h  

//
// mutex.h
// ~~~~~~~
//
// Copyright (c) 2011 Jack (jack.wgm@gmail.com)
//
 
#ifndef __MUTEX_H__
#define __MUTEX_H__
 
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
 
class mutex
{
public:
   class scoped_lock
   {
      friend class condition;
   public:
      scoped_lock(mutex& m)
         : m_mutex(m)
         , m_is_relocked(0)
         , m_semaphore(NULL)
      {
         if (m_is_relocked && m_semaphore)
         {
            DWORD ret = WaitForSingleObject(m_semaphore, INFINITE);
            switch (ret)
            {
               case WAIT_OBJECT_0:
                  break;
               case WAIT_TIMEOUT:
                  assert(0);
                  break;
               default:
                  break;
            }
         }
         m_mutex.lock();
      }
 
      ~scoped_lock()
      {
         unrelock();
         if (m_mutex.is_locked())
            m_mutex.unlock();
      }
 
   public:
      inline void lock()
      {
         m_mutex.lock();
      }
 
      inline void unlock()
      {
         if (m_mutex.is_locked())
            m_mutex.unlock();
      }
 
   protected:
      inline bool is_relocked()
      {
         return m_is_relocked;
      }
 
      inline void unrelock()
      {
         if (m_is_relocked && m_semaphore)
         {
            m_is_relocked = 0;
            ReleaseSemaphore(m_semaphore, 1, NULL);
            CloseHandle(m_semaphore);
            m_semaphore = NULL;
         }
      }
 
      inline void attach_semaphore(const HANDLE& semaphore)
      {
         m_is_relocked = 1;
         m_semaphore = semaphore;
      }
 
   protected:
      mutex& m_mutex;
      int m_is_relocked;
      HANDLE m_semaphore;
   };
 
public:
   mutex()
   {
      SYSTEM_INFO sys;
      GetSystemInfo(&sys);
      if (sys.dwNumberOfProcessors > 1)
         InitializeCriticalSectionAndSpinCount(&m_cs, 0x80000400);
      else
         InitializeCriticalSection(&m_cs);
   }
 
   virtual ~mutex()
   {
      DeleteCriticalSection(&m_cs);
   }
 
public:
   inline void lock()
   {
      EnterCriticalSection(&m_cs);
   }
 
   inline void unlock()
   {
      LeaveCriticalSection(&m_cs);
   }
 
   inline bool is_locked()
   {
      return m_cs.LockCount != -1;
   }
 
protected:
   CRITICAL_SECTION m_cs;
};
 
#endif // __MUTEX_H__

2. c++的bind简单实现

bind.h

namespace
{
    class placeholder_ {};
    placeholder_ __1;
}
 
template <typename R, typename T, typename Arg>
class simple_bind_t
{
private:
    typedef R (T::*F)(Arg);
    F f_;
    T* t_;
    Arg& a_;
 
public:
    simple_bind_t(F f, T* t, Arg &a)
        : f_(f), t_(t), a_(a)
    {}
 
    R operator()()
    {
        return (t_->*f_)(a_);
    }
};
 
template <typename R, typename T, typename Arg>
class simple_bind_t2
{
private:
    typedef R (T::*F)(Arg);
    F f_;
    T* t_;
 
public:
    simple_bind_t2(F f, T* t)
        : f_(f), t_(t)
    {}
 
    R operator()(Arg& a)
    {
        return (t_->*f_)(a);
    }
};
 
template <typename R, typename T, typename Arg>
simple_bind_t<R, T, Arg> simple_bind(R (T::*f)(Arg), T* t, Arg& a)
{
    return simple_bind_t<R, T, Arg>(f, t, a);
}
 
template <typename R, typename T, typename Arg>
simple_bind_t2<R, T, Arg> simple_bind(R (T::*f)(Arg), T* t, placeholder_& a)
{
    return simple_bind_t2<R, T, Arg>(f, t);
}
 
class bind_test
{
public:
    void print_string(const std::string str)
    {
        printf("%s", str.c_str());
    }
};
 
void test()
{
    bind_test t;
    std::string h = "hehe\n";
    simple_bind(&bind_test::print_string, &t, h)();
    simple_bind(&bind_test::print_string, &t, __1)(h);
    boost::function<void (const std::string)> f;
    f = simple_bind(&bind_test::print_string, &t, __1);
    f(h);
}

运行结果:

test函数返回结果应该是:
hehe
hehe
hehe

3. 使用Boost库实现的线程池

//My_task_queue.h :
//*************************************************************************
//Copyright: 
//Author:     Sail
//Filename:   My_task_queue.h 
//Last Mod time: 
//*************************************************************************
//Remarks:
//任务队列用来管理一系列的任务,多个工作线程阻塞在队列的条件变量上,当有任务
//加入时,则唤醒工作线程,工作完毕后继续阻塞
//
//*************************************************************************
#ifndef MY_TASK_QUEUE
#define MY_TASK_QUEUE
 
#include <queue>
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <boost/function.hpp>
 
//定义任务
typedef boost::function<void(void)> my_task;
 
class Task_queue:boost::noncopyable
{
public:
    void push_task(const my_task & task_func)
    {
        boost::unique_lock<boost::mutex> lock(my_mutex);
        my_queue.push(task_func);
        cond.notify_one();          
    }
    my_task get_task()
    {
        boost::unique_lock<boost::mutex> lock(my_mutex);
        if(my_queue.size()==0)
        {
            cond.wait(lock);
        }
        my_task task(my_queue.front());
        my_queue.pop();
        return task;
    }
    int get_size()
    {
        return my_queue.size();
    }
private:
    std::queue<my_task> my_queue;
    boost::condition_variable_any cond;
    boost::mutex my_mutex;
};
 
#endif
//My_thread_pool.h :
//*************************************************************************
//Copyright: 
//Author:     Sail
//Filename:    
//Last Mod time: My_thread_pool
//*************************************************************************
//Remarks:
//线程池使用boost中的thread_group来管理和创建工作线程,使其阻塞在任队列中
//
//*************************************************************************
 
#ifndef MY_THREAD_POOL
#define MY_THREAD_POOL
 
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>
#include <boost/function.hpp>
 
#include "My_task_queue.h"
 
typedef boost::function<void(void)> my_task;
 
class My_thread_pool:boost::noncopyable
{
public:
    My_thread_pool(int num):thread_num(num),is_run(false){}
    ~My_thread_pool(){}
    void init()
    {
        is_run=true;
        if(thread_num<=0)
            return;
        for(int i=0;i<thread_num;++i)
        {
            my_thread_group.add_thread(new boost::thread(boost::bind(&My_thread_pool::run,this)));
        }   
    }
 
    void stop()
    {
        is_run=false;
    }
 
    void  post(const my_task & task)
    {
        my_queue.push_task(task);
    }
 
    void wait()
    {
        my_thread_group.join_all();
    }
     
private:
    Task_queue my_queue;
    boost::thread_group my_thread_group;
    int thread_num;
    volatile bool is_run;
    void run()
    {
        while(is_run)
        {
 
            my_task task=my_queue.get_task();
            task();
        }
    }
};
 
#endif
// Thread_pool.cpp : 定义控制台应用程序的入口点。
//
//Test.cpp :
//*************************************************************************
//Copyright: 
//Author:     Sail
//Filename:    
//Last Mod time: 
//*************************************************************************
//Remarks:
//测试用例
//
//*************************************************************************
#include "stdafx.h"
#include "My_task_queue.h"
#include "My_thread_pool.h"
#include <iostream>
 
typedef boost::function<void(void)> my_task;
 
void print_task(int i)
{
    printf("I'm task %d\n",i);
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    My_thread_pool tp(4);
    tp.init();
     
    my_task t[4];
    for (int i= 0; i<4;++i)
    {
        t[i]=boost::bind(print_task,i+1);
        tp.post(t[i]);
    }
     
    tp.wait();
    return 0;
}

参考:

[1] https://www.oschina.net/code/snippet_54334_1856

[2] https://www.oschina.net/code/snippet_54334_10775

[3] https://www.oschina.net/code/snippet_170948_18231

Boost库是C++社区中广受欢迎的开源库之一,它提供了大量的工具和功能,使得我们能够更快速、高效地开发C++程序 boost::mpl::aux::largest_int的定义位于< boost/mpl/aux_/largest_int.hpp>头文件中,其实现原理是通过一系列模板重载来实现整型类型的比较和选择。需要注意的是,boost::mpl::aux::largest_int只能计算有符号整数类型的最大值,因此如果要计算无符号整数类型的最大值,需要将其表示为有符号整数。总之,boost::mpl::aux::largest_int是一个非常有用且灵活的类型,它可以帮助我们在编译期间进行一些高级的类型计算和选择。 阅读详情

相关推荐

C++ boost 实例学习

boost生成和解析json的完整例子 http://blog.youkuaiyun.com/dotphoenix/article/details/27081377 //   //  json_parser.h   //  mongoose   //   //  Created by Alex on 5/26/14.   //  Copyright (c) 2014 Cenbong. A

bcbobo21cn的专栏 1889

Boost的介绍、安装与环境配置

Boost的简介、下载安装以及编译、vs或vc++、vscode的环境配置

陈七的博客,学习知识分享,期待与大家的交流 5万+

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析)

本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。

weixin_29184371的博客 492

boost简介

boost 百科名片 Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响甚大,是不折不扣的“准”标准库。Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即

踏雪无痕 5083

Kaamel白皮书:IoT设备安全隐私评估实践

明确评估的目的和预期结果。

kaamelai的博客 1317

流式数据湖存储技术,Apache Paimon是什么?

是一项流式数据湖存储技术,可以为用户提供高吞吐、低延迟的数据摄入、流式订阅以及实时查询能力。Paimon 采用开放的数据格式和技术理念,可以与 Apache Flink / Spark / Trino 等诸多业界主流计算引擎进行对接,共同推进 Streaming Lakehouse 架构的普及和发展。

一个写湿的程序猿 2万+

C++ Boost库

C++ Boost库是一个功能强大、构造精良、跨平台、代码开源、完全免费的C++程序库。它由Boost社区组织开发和维护,提供了丰富的库/组件,涵盖字符串与文本处理、容器、迭代器、算法、函数对象、高阶编程、泛型编程、模板元编程、预处理元编程、并发编程、数学计算等多个领域。Boost库的设计目标是提升C++的标准库,为程序员提供更多实用的工具和功能。它包含160余个库/组件,许多已经被纳入C++标准库,如智能指针、正则表达式、函数对象绑定等。

如无必要,勿增实体。 2708

DeepSeek邮件管理全攻略

DeepSeek邮件助手是一款高效的邮件处理工具,提供智能分类、撰写、回复和任务自动化功能。通过API调用或多智能体系统,它能自动分类邮件意图、生成专业回复并优化邮件内容。核心功能包括智能过滤、会议安排和任务提醒,支持与主流邮箱服务集成。提供精准提示词模板,帮助用户快速生成得体邮件,提升工作效率。适合个人和企业使用,通过简单配置即可实现邮件处理自动化。

Genio_Wang的博客 180

基于Boost库的搜索引擎

Boost库是一个为C++语言标准库提供扩展的集合,由Boost社区开发和维护。它包含了许多高质量的C++程序库,旨在为C++程序员提供免费的、同行审查的、可移植的库。Boost的官网:---Boost官网链接搜索引擎是一种计算机程序,通过互联网或企业内部网络检索信息。用户输入关键词或短语后,搜索引擎会扫描网络上的网页、文件、图像、视频、音频等各种类型的信息资源,根据一定的算法进行排序,并将最相关的结果返回给用户。gitee地址谢健超/Liunx_git - Gitee.com。

2302_81223513的博客 1035

置顶必读(2) |《YOLOv8实战:从入门到深度优化》总目录导航 & 学习路线指南(持续更新中)

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 28万+

ThingsBoard PE专业版解决方案技术文档——温度&湿度

温湿度解决方案

weixin_67440240的博客 819

boost c linux,C++ Boost - Linux下C/C++、ACE、Boost、高性能服务器端应用 开发技术 - OSCHINA - 中文开源技术交流社区...

Boost培训(项目班)轩辕C++ Boost现场项目班课程,通过对Boost几个实用组件的学习,掌握高吞吐量、低延迟的服务器端应用开发的有效知识,且通过最终项目的历练,学员将对高性能服务器端应用开发有一个清晰的认识,并能熟练使用Boost相关的类库来开发服务器端应用。该课程的项目实战部分时间,主要讲解服务器端应用的架构、设计,以及项目实现技术的运用。上课方式:现场班/远程班课程大纲C++ Bo...

weixin_28835583的博客 179

EMC原理-传导(共模、差模)与辐射(近场、远场)详解

本文深入介绍了电磁兼容(EMC)的基本概念,包括EMI和EMS,以及如何处理传导干扰(共模、差模)和辐射干扰(近场、远场)。详细讨论了近场感应、远场辐射的原理,滤波器和屏蔽技术在抑制噪声信号中的作用。此外,探讨了差模和共模干扰的来源、影响及滤除方法,如使用差模电感、电容和共模线圈。最后,提到了穿心电容在滤除高频噪声中的应用。

让你爱上电路设计 3551

linux下网络编程MDNS,ACE高性能网络编程 - Linux下C/C++、ACE、Boost、高性能服务器端应用 开发技术 - OSCHINA - 中文开源技术交流社区...

ACE高性能网络编程一、课程目标本次课程针对使用ACE工具包进行高性能网络应用开发,通过本次课程的学习,学员将具备以下能力:了解ACE的架构和组件;理解现代操作系统线程模型、并发以及同步机制;熟练使用ACE线程管理和同步机制接口开发并发应用;熟练使用ACE基本的IPC SAP接口,如SOCK_Stream、SOCK_Dgram等;深刻理解现代操作系统中事件多路分离和分派机制如select、epol...

weixin_33258222的博客 400

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 478

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ace 高性能服务器,ACE高性能网络编程 - Linux下C/C++、ACE、Boost、高性能服务器端应用 开发技术 - OSCHINA - 中文开源技术交流社区...

ACE高性能网络编程一、课程目标本次课程针对使用ACE工具包进行高性能网络应用开发,通过本次课程的学习,学员将具备以下能力:了解ACE的架构和组件;理解现代操作系统线程模型、并发以及同步机制;熟练使用ACE线程管理和同步机制接口开发并发应用;熟练使用ACE基本的IPC SAP接口,如SOCK_Stream、SOCK_Dgram等;深刻理解现代操作系统中事件多路分离和分派机制如select、epol...

weixin_39793708的博客 393

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

关于 Subversion 协议动态代理服务器

为什么80%的码农都做不了架构师?>>> ...

weixin_33753845的博客 170

efm32 入门.pdf

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

boost库简要介绍

本质:C++程序库开发者:Boost社区目的:为C++程序员提供免费、同行审查的、可移植的程序库授权:使用Boost License授权,允许商业或非商业的使用特点:功能强大、构造精良、跨平台、代码开源、完全免费Boost库是C++程序员不可或缺的工具之一,它提供了丰富的、高质量的、可移植的程序库,极大地扩展了C++语言的功能和性能。无论是进行基础的数据处理、算法实现,还是进行高级的并发编程、网络编程等,Boost库都能提供有力的支持。

学无止尽,谨言慎行! 1363

Boost - 用户社区简介

Boost 用户社区是一个充满活力、协作紧密的团队,致力于 Boost 库的使用、开发和维护。自成立以来,Boost 已成长为涵盖各种棘手编程任务的库集合,从算法和数据结构到系统工具和并发编程。Boost用户鼓励积极分享自己的想法和经验!

298

介绍-The Boost C++ Libraries

介绍 Boost C ++库是基于C ++标准的现代库的集合。源代码是根据Boost软件许可发布的,该许可允许任何人免费使用,修改和分发这些库。这些库是独立于平台的,并支持大多数流行的编译器以及许多知名度较低的编译器。 Boost社区负责开发和发布Boost库。该社区由来自世界各地的一大批C ++开发人员组成,这些开发人员通过网站www.boost.org以及一些邮件列表进行了协调。 GitHub被用作代码存储库。社区的使命宣言是开发和收集补充标准库的高质量库。在某些时候,证明价值并对于C ++应用程序开发

ccf19881030的专栏 853

Uubntu下的Boost库安装及使用

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业或非商业的使用都是允许并鼓励的。Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。

youlinhuanyan的博客 2242

C++ Boost库详解——从入门到精通全集

Boost 是一个开源的 C++ 库集合,提供了大量高质量、可移植的组件,用于增强 C++ 标准库的功能。其主要特点包括高质量、跨平台、模块化和开源。Boost 库分为多个类别,如智能指针、容器、算法、多线程、文件系统和序列化等。使用 Boost 时,可以通过官网下载源码并编译,或使用包管理器安装。

weixin_43484713的博客 8400

Boost库介绍

Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。   Boost库由Boost社区组织开发、维护。其目的是为C++程序员提供免费、同行审查的、可移植的程序库。Boost库可以与C++标准库完美共同工作,并且为其提供扩展功能。Boost库使用Boost License来授权使用,根据该协议,商业的非商业的使用都是允许并鼓励的。   Boost社区建立的初衷之一就

mydear_33000的专栏 780

C++_开发_Boost开源库_介绍_使用

C++_开发_Boost开源库_介绍_使用

qq_44681788的博客 8634
上一篇: C++中派生类使用基类成员的问题
下一篇: 关于自定义bing函数的解释
Poo_Chai
博客等级 码龄9年 178粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值