
C++
文章平均质量分 58
xiaowhy
这个作者很懒,什么都没留下…
展开
-
concurrentqueue无锁队列多线程无序问题
最近接触了concurrentqueue的多线程无锁队列,测试了一下,发现单线程生产者和单线程消费者可以正常使用,多线程生产者的时候,即使加锁了,单线程取出来的时候好像还是无序的#include <iostream>#include "concurrentqueue.h"#include <functional>#include <thread>#include <mutex>using moodycamel::ConcurrentQueue;原创 2022-02-24 14:59:12 · 1783 阅读 · 1 评论 -
gcc7.2 with-default-libstdcxx-abi属性
碰到一个在另个系统上用gcc7.2编译时,怎么也找不到一个日志库log4cxx函数定义的问题,在自己的编译机上一切都是正常的,请教另个同事才发现,另个gcc版本加了with-default-libstdcxx-abi属性--with-default-libstdcxx-abi=gcc4-compatibleConfigured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --wi原创 2021-11-04 15:20:12 · 613 阅读 · 0 评论 -
一个简单的用来接收包缓存的buffer
一个简单的用来接收包缓存的buffer,在可能有连续多个包的时候,不用每次移动缓存,只需要移动index位置,等到快用完后,再将数据移到指针起始位置RecvBuffer.h#ifndef RECV_BUFFER_H#define RECV_BUFFER_H#include <stdio.h>#include <iostream>///////// A buffer class modeled after org.jboss.netty.buffer.Chan原创 2021-08-03 16:20:07 · 209 阅读 · 0 评论 -
gcc O2优化后内联函数指令乱序的问题
最近碰到一个结构体转换成long,再转换回来结果怎么也不对的问题,发现大概率是内联函数优化后指令乱序的问题导致的,函数放在.h里有这问题,放到cpp后正常,debug版本正常,release优化后异常https://www.cnblogs.com/yangtze736-2013-3-6/p/3561858.html和zh...原创 2021-06-03 11:07:43 · 1271 阅读 · 0 评论 -
c++ lambda的效率
参考https://blog.youkuaiyun.com/u011392018/article/details/39028457编译器实际上将lambda函数转化为一个函数对象,所以,它与使用函数对象是一样高效的,可以放心使用lambda函数而不用担心效率问题。原创 2021-05-27 10:20:26 · 666 阅读 · 0 评论 -
vs2008 std stable_sort sort的坑
struct cTestSort{ char cAscend; double dbVal; cTestSort() { memset(this, 0, sizeof(cTestSort)); }; cTestSort(int id, char casc) { cAscend = casc; dbVal = id; }; cTestSort(int id) { cAscend = 0;...原创 2021-05-08 10:24:56 · 209 阅读 · 0 评论 -
多线程pthread_cond_wait的注意事项
在使用多线程pthread_cond_signal,pthread_cond_wait时,如果在signal的时候,wait的线程在忙,没有多余的线程在wait时,signal会失效,这时候wait线程如果没有去判断队列是否有数据,而直接去wait,队列的数据就没被取走执行了。所以在wait线程中,要先判断一下队列是否为空,再去wait void CondThread::Notify() { pthread_mutex_lock(&m_mutex); ...原创 2021-02-18 15:11:37 · 258 阅读 · 0 评论 -
测试std::map与boost::unordered_map性能
测试方法:加载文件,将数据分别插入到std::map和boost::unordered_map中,分别保存string作为key和int作为key的map数据,计算插入时间,根据列表分别在对应的map中查找一次所有的key值,计算查找耗时:测试结果:插入耗时boost::unordered_map是std map的一半左右,查找耗时是std map的1/3左右测试代码:#include <boost/unordered/unordered_map.hpp>#include <原创 2021-01-12 18:27:33 · 575 阅读 · 0 评论 -
gcc库的链接顺序和依赖问题
gcc在链接库时,如果库之间 有依赖顺序,应该把被上层依赖的库放在后面参考https://www.cnblogs.com/ironx/p/4939508.htmlgcc库的链接顺序,官方是这么解释的:https://gcc.gnu.org/onlinedocs/gcc-5.2.0/gcc/Link-Options.html#Link-Optionsgcc -l 解释如下: -l library Search the library named libr...原创 2020-12-30 14:18:00 · 2164 阅读 · 3 评论 -
利用智能指针缩短临界区锁
class Foo{public: void doit(){}; }typedef std::vector<Foo> FooList;typedef boost::shared_ptr<FooList> FooListPtr;MutexLock mutex;FooListPtr g_foos;void traverse(){ FooListPtr foos; { MutexLockGuard lock(mutex)...原创 2020-12-16 16:46:57 · 139 阅读 · 0 评论 -
线程局部变量与likely,unlikely
linux下支持__thread 修饰线程局部变量,每个线程拥有自己单独的一份变量static __thread char buffer[1024];__thread int var = 0;likely 优化if,else效率#define likely(x) __builtin_expect(!!(x), 1)#define unlikely(x) __builtin_expect(!!(x), 0)if(likely(foo)) //认为foo通常为1if(unlik..原创 2020-12-11 16:18:42 · 183 阅读 · 1 评论 -
无锁队列与有锁队列性能比较
最近研究boost的无锁队列,测试了一下性能,发现无锁队列比有锁的还要慢testqueue.cpp#include <time.h>#include <boost/thread/thread.hpp>#include <boost/lockfree/queue.hpp>#include <iostream>#include <boost/atomic.hpp>boost::atomic_int producer_count(0原创 2020-09-17 10:21:20 · 2256 阅读 · 0 评论 -
libevhtp一个基于libevent编写的开源的http服务端网络模块学习
最近学习libevhtp的源码,网络的框架大概也是基于libevent,主线程中accept新连接,创建多个子线程,每个线程拥有自己的eventbase,有新连接来的时候,通过判断缓存中正在处理的最小连接数,利用管道通知,将连接分配到子线程中,建立event到子线程的base上bool HttpMainThread::Init(){ evbase = event_base_ne...原创 2020-04-03 11:03:50 · 1806 阅读 · 0 评论 -
Linux epoll 模型详解
Linux epoll 模型详解2019-09-22综合select和poll的一些优缺点,Linux 从内核 2.6 版本开始引入了更高效的 epoll 模型,本节我们来详细介绍 epoll 模型。要想使用 epoll 模型,必须先需要创建一个 epollfd,这需要使用epoll_create函数去创建: 123 #includ...原创 2020-03-27 14:55:42 · 380 阅读 · 0 评论 -
socket send和recv正确用法
socket 非阻塞模式下的 recv 行为非阻塞模式下如果当前无数据可读,recv 函数将立即返回,返回值为-1,错误码为EWOULDBLOCK。将客户端代码修成一下: 1234567891011121314151617181920212223242526272829303132333435363738...原创 2020-03-26 16:36:10 · 3383 阅读 · 0 评论 -
基于C11的一个任务池模型
#pragma once/*** 任务池模型 TaskPool.h*/#include <thread>#include <mutex>#include <condition_variable>#include <list>#include <vector>#include <memory>#includ...原创 2020-03-26 15:41:00 · 277 阅读 · 0 评论 -
简单的libevent例子
server.cpp#include <stdio.h>#include <iostream>#include <map>#include <string.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>原创 2019-02-20 17:20:50 · 482 阅读 · 0 评论 -
一个内存池类
#ifndef _INCLUDE_CXMEMPOOL_H_#define _INCLUDE_CXMEMPOOL_H_#include #include "backcom/lock.h"#include #include using namespace BackCom;using namespace std;////多线程使用 一个线程申请 一个线程释放 cl原创 2017-07-27 16:55:34 · 375 阅读 · 0 评论 -
一个网络库的实现
#ifndef CCONMAG_H#define CCONMAG_H#include #include #include #include #include using namespace std;#include "pageset.h"#include "taskqueueproc.h"#include "baselog.h"#includ原创 2017-07-28 17:00:03 · 583 阅读 · 0 评论 -
使用数组保存
template//用3个数组,替代锁class CCircleQueue{public: CCircleQueue() { m_nUsePos = 0; } ////切换资源结束 void SwitchSourceEnd() { if (m_nUsePos+1 == ArrayNum)原创 2017-08-24 09:44:16 · 665 阅读 · 0 评论 -
线程安全内存池
#ifndef _INCLUDE_THREADSAFEMEM_H_#define _INCLUDE_THREADSAFEMEM_H_#include "MemPoolTemplate.h"#include "FixLenMemPoolLock.h"#define MAXWORKTHREADNUM 7//最多7个工作线程namespace XUANXUAN{cla原创 2017-08-24 09:56:21 · 949 阅读 · 0 评论 -
无锁单线程内存池
#ifndef _INCLUDE_FIXLENMEMPOOLNOLOCK_H_#define _INCLUDE_FIXLENMEMPOOLNOLOCK_H_#include "log.h"#include namespace XUANXUAN{//无锁缓存 单线程使用class CFixLenMemPoolNoLock{public: struct T原创 2017-08-30 14:22:58 · 437 阅读 · 0 评论 -
慎用select
http://blog.youkuaiyun.com/stpeace/article/details/73718836select //连接代理服务器 connect(socket, (sockaddr*)&servAddr, sizeof(sockaddr)); FD_ZERO(&r); FD_SET(socket, &r); timeout.原创 2017-09-19 17:21:58 · 522 阅读 · 0 评论 -
读写锁写锁优先的坑
pthread_rwlockattr_setkind_np(&rwLockAttr,PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP);可以设置写锁优先,当写锁和读写同时抢占时,写锁会优先执行,但这时读锁就不能在执行了,但同一个线程不能多次读锁当一个线程有多次调用读锁时,就可能会出现死锁了比如thread1 readlock readloc原创 2017-11-01 17:32:28 · 2813 阅读 · 0 评论 -
并发高时公用锁拆分
当并发高时,可能存在多个连接公用一个锁,当有一个卡住时,会影响其他连接速度可以按某种规则,比如用户uid,将不同用户拆分到不同的锁上面去,临界区共享数据也同样的规则做拆分原创 2017-11-29 14:45:16 · 512 阅读 · 0 评论 -
undefined reference to `vtable for CPushNotify'
错误原因: 基类的虚函数只声明没有定义。修改:1,用纯虚函数2、写出虚函数的定义原创 2018-03-16 14:58:37 · 308 阅读 · 0 评论 -
一个多叉树(10叉数),保存纯数字的字符串树
一个多叉树 (10叉数),匹配数字组成的字符串,比如123可以查找父节点,比如12是123的父节点,也可以查找子节点组成的树为 1->2->3struct ChoiceDetail{ char blockid[50]; vector<int> setstockindex; ChoiceDetail() { ...原创 2018-07-24 15:04:54 · 883 阅读 · 0 评论 -
使用gprof,tcmalloc,pprof性能统计分析
一、前言参考GPROF用户数手册:http://sourceware.org/binutils/docs-2.17/gprof/index.html参考博客:http://blog.youkuaiyun.com/stanjiang2010/article/details/5655143GPROF是GCC自带的性能测试工具,可以统计出各个函数的调用次数、时间、以及函数调用图。二、教程使用GR...转载 2018-08-30 10:48:52 · 2531 阅读 · 0 评论 -
pthread_cond_wait详解
https://blog.youkuaiyun.com/special00/article/details/52279564pthread_cond_wait会先将mutex锁释放,再加上cond条件变量锁,等到收到信号后,再将mutex锁加上 通常,和pthread _cond_wait 配对使用的有pthread_cond_signal , 同时还有用于pthread_cond_t初始化的...转载 2018-09-06 09:12:09 · 520 阅读 · 0 评论 -
c++对象模型
转载//整理之,分享之,欢迎指正。for_wind1、C与C++的区别: 概括来说,C程序中程序性地使用全局数据[注1]。而C++采用ADT(abstract data tpye)或class hierarchy的数据封装。 加上封装后,C++在布局以及存取时间上的主要额外负担是由virtual引起的(见本文3、加上继承部分)。 包括:(1)virtua...转载 2018-10-25 15:39:05 · 195 阅读 · 0 评论 -
使用sock5代理连接tcp
#ifndef EMS_PROXY_H#define EMS_PROXY_H#pragma once#include #include #include using namespace std;/*sock代理工作原理大致如下: 1。[需要代理方]向服务器发出请求信息; 2。[代理方]应答; 3。[需要代理方]接到应答后发送向[代理方]发转载 2017-07-25 09:04:46 · 15731 阅读 · 1 评论