Boost(开放的源码,强大的工具)
文章平均质量分 81
骑在木马上的黑客
纵有疾风起,人生不言弃!
展开
-
Boost.thread创建线程的各种情景
创建线程 首先看看boost::thread的构造函数吧,boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(const boost::function0& threadfunc): boost::function0可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是...原创 2018-05-28 09:00:26 · 805 阅读 · 0 评论 -
Boost.xml_parser读写内容简单的Xml
//范例如下,注释随代码#include <iostream> #include <string> #include <map> using namespace std; #include <boost/property_tree/ptree.hpp> #include <boost/property_tree/xml_p...原创 2018-05-08 10:59:38 · 874 阅读 · 0 评论 -
Boost.bind的工作原理和应用场景
bind的工作原理:bind并不是一个单独的类或函数,而是非常庞大的家族,依据绑定的参数的个数和要绑定的调用对象的类型,总共有数十种不同的形式,编译器会根据具体的绑定代码制动确定要使用的正确的形式,bind的基本形式如下:template<class R,class F> bind(F f);template<class R,class F,class A1> bind(...原创 2018-05-07 19:34:41 · 551 阅读 · 0 评论 -
Boost.DateTime日期时间的操作
Boost.DateTime库提供了时间日期相关的计算、格式化、转换、输入输出等等功能,为C++的编程提供了便利。不过它有如下特点:1. Boost.DateTime 只支持1400年以后的任何Gregorian日历日期。如果你需要计算再早的日期,则需要寻求其他库来支持。日期和时间是编程过程中常用的操作。在C标准库中,<time.h>提供了time_t类型、和tm结构类型的时间日期相关...原创 2018-05-14 13:45:36 · 823 阅读 · 0 评论 -
Boost.shared_ptr陷阱
条款1:不要把一个原生指针给多个shared_ptr管理int* ptr = new int;shared_ptr<int> p1(ptr);shared_ptr<int> p2(ptr); //logic errorptr对象被删除了2次这种问题比喻成“二龙治水”,在原生指针中也同样可能发生。 条款2:不要把this指针给shared_ptrclass Test{publ...原创 2018-05-14 12:26:54 · 818 阅读 · 0 评论 -
Boost.shared_mutex写优先,读共享,交叉互斥
shared_mutex即读写锁,不同与我们常用的独占式锁mutex,shared_mutex是共享与独占共存的锁,实现了读写锁的机制,即多个读线程一个写线程,通常用于对于一个共享区域的读操作比较频繁,而写操作比较少的情况。 读写锁比起mutex具有更高的适用性,具有更高的并行性,可以有多个线程同时占用读模式的读写锁,但是只能有一个线程占用写模式的读写锁,读写锁的基本规则可以总结为<写...原创 2018-05-07 10:00:48 · 1427 阅读 · 0 评论 -
Boost.circular_buffer用法详解
Boost.Circular_buffer维护了一块连续内存块作为缓存区,当缓存区内的数据存满时,继续存入数据就覆盖掉旧的数据。它是一个与STL兼容的容器,类似于 std::list或std::deque,并且支持随机存取。circular_buffer 被特别设计为提供固定容量的存储大小。当其容量被用完时,新插入的元素会覆盖缓冲区头部或尾部(取决于使用何种插入操作)的元素。具体用法详见代码:#i...原创 2018-05-12 21:52:20 · 3684 阅读 · 0 评论 -
Boost.asio网络库多线程并发处理实现,以及asio在多线程模型中线程的调度情况和线程安全
1、实现多线程方法:其实就是多个线程同时调用io_service::run for (int i = 0; i != m_nThreads; ++i){ boost::shared_ptr<boost::thread> poThread(new boost::thread(boost::bind(&boost::asio::io_service::run,&...原创 2018-05-12 17:33:58 · 5316 阅读 · 0 评论 -
Boost.shared_lock解决读者和写者问题
boost::shared_lock 的类提供了非独占锁,这个类必须和 boost::shared_mutex 型的互斥量一起使用。boost::shared_mutex它允许线程获取多个共享所有权和一个专享所有权,它比mutex的代价高很多。通过lock_shared()或try_lock_shared()获取共享所有权,使用unlock_shared()来释放共享所有权。 读锁定时share...原创 2018-05-06 11:34:12 · 983 阅读 · 0 评论 -
boost库多线程(Thread)编程(线程操作,互斥体mutex,条件变量)
1 创建线程就像std::fstream类就代表一个文件一样,boost::thread类就代表一个可执行的线程。缺省构造函数创建一个代表当前执行线程的实例。一个重载的构造函数以一个不需任何参数的函数对象作为参数,并且没有返回值。这个构造函数创建一个新的可执行线程,它调用了那个函数对象。起先,大家认为传统C创建线程的方法似乎比这样的设计更有用,因为C创建线程的时候会传入一个void*指针,通过这种...原创 2018-05-06 11:14:35 · 392 阅读 · 0 评论 -
Boost.xml_parser嵌套遍历Xml
property_tree是一个保存了多个属性值的属性数据结构,可以用类似路径的简单方式访问任意节点的属性,而且每个节点都可以用类似STL的风格遍历子节点。property_tree特别适合于应用程序的配置数据处理,可以解析xml、ini、json和info四个格式的文本数据。在处理四种格式的文件时,除包含头文件、读文件、写文件时有部分区别外,其他对文件内部数据操作时基本一致(因为文件格式都基本一...原创 2018-05-08 11:04:26 · 1054 阅读 · 0 评论 -
Boost.mutex递归访问同一把锁造成死锁
mutex虽然可以很好地协调线程同步,互斥访问全局变量。但不慎使用,也可能会造成死锁。下面这段代码就演示了递归访问同一把锁造成的死锁:#include<iostream>#include<iomanip>using namespace std;#include <boost/thread.hpp> #include <boost/bind.hp...原创 2018-05-15 09:24:44 · 923 阅读 · 0 评论 -
Boost.mutex连续两次加锁会造成死锁
问题代码如下:#include<iostream> #include<iomanip> using namespace std; #include <boost/thread.hpp> #include <boost/bind.hpp> #include <boost/thread/mutex.hpp> ...原创 2018-05-23 09:25:54 · 1676 阅读 · 0 评论 -
连接服务器,并向服务器发送一个GET请求包,等待响应【同步方式】
连接服务器,并向服务器发送一个GET请求包,等待响应。#include <iostream> #include <string>using namespace std;#include <boost/asio/ip/tcp.hpp > #include <boost/asio.hpp> using namespace boost;...原创 2018-05-16 12:07:09 · 884 阅读 · 0 评论 -
Boost.worker可以保证ioservice一直run下去,直到调用stop
boost::asio 在创建io_service时,可以指定线程数,如果没有指定,默认是一个线程,也就是io_service run的那个线程,如果没有任务运行,该线程会退出。 如果在创建的时候指定了线程数,那么io_service在执行的时候线程数就可以并发执行,如果你run的线程还是只有1个,那么io_service想多线程执行也没有条件,asio在内部是没有创建...原创 2018-05-16 10:21:01 · 1488 阅读 · 0 评论 -
Boost.resolver将域名映射为IP,将服务转换为端口
示例代码如下:#include <iostream> using namespace std;#include <boost/asio/ip/tcp.hpp > #include <boost/asio.hpp> using namespace boost;typedef boost::asio::ip::tcp::resolver::que...原创 2018-05-16 08:57:54 · 1057 阅读 · 0 评论 -
Boost.query用来保存表示IP的域名和端口上的服务名
示例代码如下:#include <iostream> using namespace std;#include <boost/asio/ip/tcp.hpp > using namespace boost;//用来保存IP地址、域名、IP地址的类型、主机的端口或服务名称typedef boost::asio::ip::tcp::resolver::query...原创 2018-05-16 08:34:00 · 257 阅读 · 0 评论 -
CThreadGroupEx普通计时器和高精度计时器
每隔一段时间,就会被触发一次,可用于定时备份和CS中的心跳检测.#include<ctime>#include<cstdio>#include<iostream>#include<string>using namespace std;#include <boost/asio.hpp> #include <boost/...原创 2018-05-16 08:24:06 · 224 阅读 · 0 评论 -
CThreadGroupEx多任务多线程,无序执行和有序执行
CThreadGroupEx对thread_group进行了封装,实现了函数执行体的内置,可以很好地控制各个线程。新增任务的任务可以实现有序执行。#include<ctime>#include<cstdio>#include<iostream>#include<string>using namespace std;#include <...原创 2018-05-15 19:39:19 · 332 阅读 · 0 评论 -
Boost.signals2信号/槽的小例子
信号槽是Qt框架中一个重要的部分,主要用来解耦一组互相协作的类,使用起来非常方便。项目中有同事引入了第三方的信号槽机制,其实Boost本身就有信号/槽,而且Boost的模块相对来说更稳定。 signals2基于Boost里另一个库signals实现了线程安全的观察者模式。signal中一个比较重要的操作函数是connect,它把插槽连接到信号上;插槽可以是任意可调用对象,包括函数指针、函数对象...原创 2018-05-06 09:11:38 · 523 阅读 · 0 评论 -
CSemaphore自定义轻量级信号量实现的同步
程序描述:主线程启动10个子线程并将表示子线程序号的变量地址作为参数传递给子线程。子线程接收参数 -> sleep-> 全局变量++ -> sleep -> 输出参数和全局变量。要求:1.子线程输出的线程序号不能重复。2.全局变量的输出必须递增。下面画了个简单的示意图:分析下这个问题的考察点,主要考察点有二个:1.主线程创建子线程并传入一个指向变量地址的指针作参数,由于线程...原创 2018-05-12 15:22:13 · 408 阅读 · 0 评论 -
四个线程写四个文件03 跨平台实现(Boost)
函数【extern void ConsoleOutput(bool bClient, char* lpszFmt, ...);】的具体实现请参考博客《Boost.asio实现同步的TCP/IP通信》#include<ctime>#include<cstdio>#include<iostream>#include <fstream>using ...原创 2018-05-11 09:52:00 · 212 阅读 · 0 评论 -
连接服务器,并向服务器发送一个GET请求包,等待响应【异步方式】
连接服务器,并向服务器发送一个GET请求包,等待响应。#include <iostream> #include <string> using namespace std;#include <boost/asio/ip/tcp.hpp> #include <boost/asio.hpp> #include <boost/bin...原创 2018-05-17 09:22:32 · 1191 阅读 · 0 评论 -
Boost.result_of、ref、bind详细用法示例
可以帮助程序员确定一个调用表达式的返回类型,主要用于泛型编程和其他Boost库组件#include<math.h>#include<iostream>using namespace std;#include<boost/utility/result_of.hpp>//result_of#include<boost/typeof/typeof.h...原创 2018-05-10 14:18:18 · 513 阅读 · 0 评论 -
Boost.signals2访客按下门铃,门铃响后,护士和婴儿各自不同的反应
Boost.signals2访客按下门铃,门铃响后,护士和婴儿各自不同的反应。实现代码如下:/#include<cstdlib>#include<ctime>#include<string>#include<iostream>using namespace std; #include<boost/ref.hpp>#inc...原创 2018-05-09 12:14:55 · 222 阅读 · 0 评论 -
Boost.signal传统模式下的观察者模式与信号/槽机制实现的观察者模式
传统模式下的观察者模式与信号/槽机制实现的观察者模式实现代码如下:#include <iostream>#include <list>using namespace std; #include "boost/shared_ptr.hpp"#include "boost/signal.hpp" using namespace boost; //观察者基类...原创 2018-05-09 12:12:43 · 890 阅读 · 0 评论 -
Boost.bind的实现源码
#include<iostream>#include<iomanip>using namespace std;template<typename ReturnType, typename ClassType, typename ParamType>class CFunctionCall{public: CFunctionCall(Return...原创 2018-04-13 16:40:50 · 227 阅读 · 0 评论 -
Boost.any的实现源码
#include<iostream>#include<iomanip>using namespace std;class any{public: //Representation and basic construction of a generalized union type. any(): content(NULL){cout <&l...原创 2018-04-13 16:37:16 · 481 阅读 · 0 评论 -
Boost库的编译和使用
1、打开cmd命令窗体,执行bootstra.bat文件(生成编译器bjam.exe)2、在cmd窗体中执行bjam.exe文件(编译源文件cpp,生成lib文件)3、编译器附加的路径[E:\ProgramFiles\Boost]4、链接器附加的路径[E:\ProgramFiles\Boost\stage\lib]...原创 2018-04-22 08:16:43 · 262 阅读 · 0 评论 -
CJobQueue任务队列的实质就是生产者消费者模型的应用
详细实现代码如下:#ifndef JOBQUEUE_H__#define JOBQUEUE_H__#if defined(_MSC_VER) && (_MSC_VER >= 1200)# pragma once#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)namespace net {...原创 2018-05-18 12:25:49 · 299 阅读 · 0 评论 -
路漫漫其修远兮,吾将上下而求索
未完成待完成代码:#include<iostream>#include<pthread.h>#include<cstdio>#include<list>#include<exception>using namespace std;#include <boost/thread.hpp> #includ...原创 2018-05-18 12:52:47 · 223 阅读 · 0 评论 -
win_iocp_io_service浅析
进入正题,简要说一下asio的实现原理吧。在win32平台上,asio是基于IOCP技术实现的,我以前也用过IOCP,却没想到居然能扩展成这样,真是神奇!在其他平台下还会有别的方法去实现,具体见io_service类下面这部分的源码: // The type of the platform-specific implementation.#if defined(BOOST_ASIO_HAS_IO...原创 2018-05-12 14:30:50 · 690 阅读 · 0 评论 -
Boost.mutex+condition_variable_any实现生产者消费者
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用。使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足。如果条件不满足,则释放锁,将线程置为waiting状态,继续等待;如果条件满足,则重新获取锁,然后结束wait,继续向下执行。#include <stdio.h> #include <process...原创 2018-05-05 19:33:53 · 618 阅读 · 0 评论 -
Boost.thread之while(true)型线程终结方法
我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:void ThreadBody() { while( true ) { std::cout << "Processing..." << std::endl; Sleep(1000); } } 那么,...原创 2018-05-12 10:38:00 · 577 阅读 · 0 评论 -
IO模型
io_service对象是asio框架中的调度器,所有异步io事件都是通过它来分发处理的(io对象的构造函数中都需要传入一个io_service对象)。 asio::io_service io_service; asio::ip::tcp::socket socket(io_service);在asio框架中,同步的io主要流程如下: 应用程序调用IO对象成员函数执行IO操作IO...原创 2018-05-12 08:37:42 · 234 阅读 · 0 评论 -
主动器(Proactor)
2. 主动器(Proactor) (1)Proactor需要调用者定义一个异步执行的操作,例如,socket的异步读/写; (2)执行异步操作,异步事件处理器将异步请求交给操作系统就返回了,让操作系统去完成具体的操作,操作系统在完成操作之后,会将完成事件放入一个完成事件队列。 (3)异步事件分离器会检测完成事件,若检测到完成事件,则从完成队列中取出完成事件,并通知应用程序注册的完成事件处理函...原创 2018-05-05 18:04:54 · 533 阅读 · 0 评论 -
反应器(Reactor)
网络方面用的比较多的库是libevent和boost.asio,两者都是跨平台的。其中libevent是基于Reactor实现的,而boost.asio是基于Proactor实现的。Reactor和Proactor模式的主要区别就是真正的操作(如读/写)是由谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而在Proactor模式中,应用程序不需要进行实际的读/写过程,操作系统会读取缓...原创 2018-05-05 18:02:32 · 966 阅读 · 0 评论 -
Boost.asio实现异步的TCP/IP通信
【服务器】#include "stdafx.h"#include <iostream>#include <boost/shared_ptr.hpp>#include <boost/asio.hpp>#include <boost/asio/placeholders.hpp>#include <boost/system/error_co...原创 2018-05-05 17:48:39 · 1132 阅读 · 0 评论 -
Boost.asio实现同步的TCP/IP通信
服务器【如果想保留套接字之后继续通信,可以动态申请socket_type,保存指针,因为socket_type貌似不能拷贝】#include "stdafx.h"#include <iostream>#include <boost/asio.hpp>using namespace boost::asio;using namespace std;int main...原创 2018-05-05 17:45:14 · 1779 阅读 · 0 评论 -
Boost.asio基本概念
asio库基于操作系统提供的异步机制,采用前摄器模式(Proactor)实现可移植的异步(或同步)IO操作,不需要使用多线程和锁,有效避免多线程编程带来的诸多有害副作用(如竞争,死锁)。 asio封装了操作系统的select、kqueue、poll/epoll、overlapped I/O等机制,实现异步IO模型。在同步模式下,程序发起一个IO操作,向io_service提交请求,io_ser...原创 2018-05-05 17:32:42 · 378 阅读 · 0 评论