随笔分类 - C++
摘要:有的时候程序必须依赖第三方库来完成I/O操作,鉴于这种情况,Boost::Asio提供了一个null_buffers 类型可以同时完成读和写操作,null_buffers 直到执行I/O操作的对象就绪才返回。下面是一个执行非阻塞的读操作的例子ip::tcp::socket socket(my_io_
阅读全文
摘要:Boost::Asio中的许多I/O对象是流导向的,这意味着; @没有消息边界,在传输的数据是一个连续的字节序列 @读或者写传输的字节可能比请求更小,这就是被称作简短的读或者写 提供流定向模型的对象一个或者多个下列类型的必要条件:SyncReadStream,使用成员函数read_some()执行同
阅读全文
摘要:从根本上讲,I/O包含了数据从源到目的地的连续内存的传输,这叫做缓存,这些缓存可以简单的描述为包含了一个指针和一组字节数据的元组,然而,为了支持高效网络应用程序的开发,Boost::Asio支持分散-聚合操作,这些操作同时支持一个或多个缓存。分散读 接收数据并写入多重缓存中。分散写 传输数据给多个缓
阅读全文
摘要:一个串被定义为序列的调用事件句柄(非并行调用),使用串允许在多线程环境中执行代码而不使用显示的互斥锁。串可以是隐式的或者显式的,如下方的可替代方法所示:仅在一个线程中调用io_service::run()意味着使用隐式的串执行所有的事件句柄,因为io_service确保了句柄只被run()内部调用。
阅读全文
摘要:线程安全一般的,高并发使用不同的对象是安全的,在高并发中使用单一的对象是不安全的,io_service类型提供了单对象高并发的强安全保证。线程池多线程可能调用io_service::run()来建立一个可以调用完成句柄的线程池,也可以使用io_service::post()把计算任务交给线程池处理。
阅读全文
摘要:Boost::Asio为同步和异步操作提供了并行支持,异步支持基于前摄器模式,这种模式的优点和缺点可能比只同步或反应器方法要低。让我们检查一下Boost::Asio是如何实现前摄器模式的,没有引用基于平台的细节。前摄器设计模式,改编自POSA2--异步操作 定义一个异步执行的操作,比如socket的
阅读全文
摘要:Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子你的程序需要一个io_servi
阅读全文
摘要:多线程及多进程编程同步时可能出现的问题,如果一个值被P1读取两次,两次的值相同,据此判断该值没有被修改过,但该值可能在两次读取之间被P2修改为另外一个value,并在P1再次读取之前修改回了原值。P1被愚弄,认为该值一直没有改变过。 下面的事件序列会导致ABA问题 1.线程P1访问共享内存的valu
阅读全文
摘要:for(int i = 0,j = 1; i = j = 0; i++, j--){;}以上循环会执行多少次A 0B 1C 无限循环D 以上都不对 关键是条件的赋值表达式i = j = 0;结果还是0,第一次循环都不会执行,如果这里换成i = j = 1;就会是无限循环。 同理的if和while判断
阅读全文
摘要:看题说话 test a(); test b(2); test c[3]; test &ra = b; test d = b; test pA = c; test p = new test(4); 到底产生了多少个对象,我也是好奇这道题考察的是什么?因为这里面不是简单的考察构造函数和拷贝构造函数,还捎
阅读全文
摘要:getopt是linux下获取程序启动参数的函数 #include int getopt(int argc, char * const argv[], const char *optstring); extern char *optarg; extern int optind, opt...
阅读全文
摘要:判断一个字符c是否在一个字符串str中,你会怎么处理?1.for或者while循环判断可以,但是效率够呛2.建立size为256的静态映射表char tb[256],将字符串str中的所有数值映射到tb中,判断tb[c]==1就可以知道字符是否存在str中。可以,还是可以优化的3.用位压缩技术对tb...
阅读全文
摘要:段错误或者其他导致程序退出的错误一直以来都像蛮不讲理的莽汉一样,把我们辛辛苦苦开发的程序肆意破坏掉,留下一个或大或小的core文件让我们头疼去,我们痛哭流涕之后默默承受这份忧伤。。。段错误由SIGEGV产生,可以被用户捕捉,也就给了我们保存程序重要数据的机会,借用glibc某函数处理SIGEGV的一...
阅读全文
摘要:getopt是linux下解析命令行参数的api。以linux内核代码的一个例子来说明:static void cmdline(int argc, char *argv[]){ int opt; progname = basename(argv[0]); while ((opt = getopt(...
阅读全文
摘要:目标场景是这样的: 多线程的应用程序要频繁打一些小字节的日志,也不想引用很重的日志库。 设想了一个极其简单的日志组件,main线程中重定向stdout到文件,同时setbuffer设置一个10k的缓冲区,工作线程直接向stdout输出日志。 很简单,但是有些担心,多线程写同一个文件会不...
阅读全文
摘要:看memcached代码的时候学习了一个api,setbuf,可以设置文件流的缓冲区。 #include void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stream, char *buf, size_t size); void...
阅读全文
摘要:编码规范不仅仅是好看,更是避免各种稀奇古怪问题的好方法,你永远不会知道不规范的编码会有什么幺蛾子问题。我遇到的问题:一份运行的好好的代码突然就不能编译了,检查了所有的代码都没有问题,最后在同事的帮忙下解决了,根源竟然是缩进的时候使用了tab而不是空格的问题,另外还有中文注释引起过的问题就不提了,这...
阅读全文
摘要:以下摘自维基百科,mark一下,以备不时之需。For the purposes of this table, a, b, and c represent valid values (literals, values from variables, or return value), object ...
阅读全文
摘要:不是为了循环的while。1.用于宏定义,保证宏一定按照想要的方式执行。#define foo(x) start(x); end(x)if(flag) foo(x);扩展以后的结果if(flag) start(x);end(x);如果是do{..}while(0)的形式,可以保证宏按照定义的预...
阅读全文
摘要:36m的文件,在局域网服务器之间socket单进程传输,client读取源文件并socket发送文件,server接收文件。server日志打屏的时候花费时间begin sec[1433750824], microsec[847467]file[tsl.txt] read over .end se...
阅读全文

浙公网安备 33010602011771号