自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 资源 (2)
  • 收藏
  • 关注

原创 rust学习(BorrowMut异常)

一个cell貌似不能同时被借用两次,注意!所以如果出现这类错,也要考虑是否有多线程的问题。但是如果一直拿着borrow_mut的句柄,就会报错。不要长期持有borrow_mut的句柄。

2024-04-17 18:42:50 198

原创 rust学习(recursive mutex 实现)

哈哈,网上查了一下,很多人都说recursive lock是垃圾代码,要修复。鉴于个人能力,很多这样的代码我都改不掉,所以我用Rust实现了一个recursive的锁。4.如果锁的owner不是当前线程,则调用这个m_cond等待。当锁释放的时候,如果计数为0,唤醒m_cond等待的线程。2.锁的owner,每次拿到锁以后记录拿锁线程,防止其他线程调用unlock释放。6.如果当前计数为0,表明锁都已经释放,直接唤醒所有等待锁的队列。1.获取锁计数,如果计数到0的话,唤醒其他等待线程去拿锁。

2024-04-09 16:43:21 435

原创 rust学习(tokio中tcp_stream调用的问题)

我们涉及了一个socket连接的类,每次收到数据以后,我们都会把tokio::net::TcpStream对应的tcp_stream传递给其他线程。2.由于线程1一直在等数据,所以线程2只能在这里2处卡住。1.stream直接move给TarNetStream。2.回调函数中采用了Arc智能指针。1.没有数据,这里卡死。

2024-04-08 15:29:12 260

原创 rust学习(简单handler实现)

1.message处理的时候调用了ProcessMessage,这里主要考虑到使用的方便(不要再用什么unwrap),所以传出去的数据重新构造了一个新数据,性能上会有损耗。每次有新消息加入的时候,重新针对消息队列排序,然后cond.notify一下,唤醒等待线程。2.target是一个回调实现,每个message都需要带有target,这样message就能由指定的handler处理了。1.消息队列头,为了减少option,这里规定了第一个消息一直不使用,所有消息从head的next开始排队。

2024-03-20 16:24:56 367

原创 rust学习(简单链表)

我们发现,try_borrow_mut貌似只有refcell实现了,所以这个接口返回的是我们需要的值RefMut<>,但是注意一下,由于try_borrow_mut返回的是result,所以我们还需要unwrap一下。一个是BorrowMut,一个是RefCell的。目前我就遇到一个比较神奇的问题:使用borrow_mut之后,无法找到成员变量..仔细对比了2个borrow_mut函数,你会发现,我去,完全是2个接口~编写一个简单链表,主要遇到的问题就是next指针(按照C的写法)的数据如何定义。

2024-03-14 19:07:37 553 1

原创 rust学习(手动写一个线程池)

1.创建一个Condition,用智能指针控制,这样计算和等待的线程都能使用。3.cond:用来等待计算完成的condition,和Task结构体中的cond是同一个,这样task完成后就能唤醒等待了。1.results:用来存放结果,其中u32是一个future的id,T表示存放的数据。1.id:这个future的id,通过这个id可以在map中找到结果。2.将task存放到任务队列,计算线程就是从这个队列中获取任务的。只有一个get函数,如果有数据,就返回该数据,否则就等待唤醒。

2024-03-07 10:10:26 482

原创 rust学习(模拟Future)

4.MTask::future:存储了future的信息,用了智能指针,主要是等待线程需要持有一份,处理线程也需要持有一份,2个线程是通过future里面的cond来唤醒。3.生成一个future,这里i32::getDefault()获取默认数据,模板玩的不溜,这里直接写死了。原理比较简单,从future中获取数据元,如果元组第一个为true,则表明计算完成,直接返回数据,否则就调用condvar来等待。2.创建一个lambda函数,这里简单写了一个直接返回i32的函数,实际场景可能会是比较负责的函数。

2024-03-06 13:20:02 508

原创 rust学习(tokio future分析)

貌似调用block_on之后会回调一次future的poll,如果这个时候还没有计算出结果,那就直接卡死了,所以需要找个地方能唤醒。关键是在poll返回pending的时候,获取waker。1.当调用block_on的时候,会直接调用一次future的poll确认是否运算结束。所以我们现在要加一个标志位来表示运算结束,这样block_on应该就能正常走下去了吧。2.当调用waker.wake的时候貌似还会调用一次poll确认是否运算结束。自己编写一个impl future来看一下Tokio的是如何实现的。

2024-03-05 15:09:14 561

原创 rust学习(tokio协程分析二)

之前用过C语言的libco,它的原理是通过注册了libc的大部分posix的io操作函数,然后通过epoll来实现异步io来实现。例如读取socket的数据,如果没有数据,由于是异步io,所以直接切换到下一个调用栈。哈哈,可以看到,线程最后启动了一个和之前毫无关系的协程代码,里面只是一个sleep(注意!这个是tokio的sleep),这个sleep的作用就是满足线程有一个协程切换的入口点。根据代码1的情况,我们考虑是否可以保持线程不退出(如代码2),这样是否可以执行到协程(doSayHi)呢?

2024-03-01 19:29:54 502

原创 rust学习(tokio协程分析一)

从blocking队列中获取数据,注意这个blocking队列使用了mutex和condvar,所以当condvar卡住的时候,实际上是整个线程直接卡住,由于协程只是在线程中来回切换调用栈,所以协程中所有的等待处理实际上都是切换调用栈,但是这个condvar不是切换调用栈,所以就会卡住。这样实际上协程的runtime会创建线程,让协程跑在这些线程上,如上述代码,我们通过worker_threads创建了一个线程,所有的协程都会跑在这个线程上。doAsyncPrint一直没有被调用。

2024-02-29 14:17:11 618

原创 我和我的同事们(二)

我去,有人和我抢江边的座位/我先点菜了,你们慢慢来...”,每隔几分钟,D就更新一下进展,感觉比我们当年bringup时候汇报的还勤快。D是真得能说,在遇到他之前,我完全没有想到过一个理工科男生会有这么好的文学底蕴。聊着聊着,我仿佛感觉D还是我当年遇到的那个样子,一个28岁的男生,干活疯疯火火,各种事情都能和你聊。第二天九点多,还在吃早饭,D已经发来消息,他已经开始排队抢位置了。额~~,在吃这块,D的行动力的确无与伦比。于是我不得不开始加快我的步伐,快点吃完早饭,快点出们,快点去火锅店,快点去见D~~。

2024-01-21 22:29:24 359

原创 Android性能优化(bin启动优化)

android 性能优化

2023-07-10 22:31:30 197

原创 如何优雅的写C++代码 Obotcha介绍(构建自己的Handler)

用过android的同学,一定会对Handler很熟悉,使用起来也特别方便。自己看Handler的代码,你会发现其实就是一个简单的消息队列机制。Obotcha模仿android(也可以说是抄)构建了自己的一个Handler。首先介绍Obotcha中关键的几个类,

2023-07-03 22:31:51 143

原创 我和我的同事们(一)

对的,对的,我们要马上回去拯救R。“R,这个样机你保管一下”,“R,你帮我们抓一下数据”,“R,代码base我写好了,你去帮忙review一下,再修改修改”....现在回想起来,很难相信怎么会有这样一个人,能承受这么多琐碎的事。R对于我和娇娇,基本属于无脑式的信任,每次讨论问题,一旦我们有天马行空的思路,哈哈,这个头铁的R一定会想尽一切方法来实现我们的方案,因为他说过,“他觉得我们一定是对的”,有这样信任我们的同事,深感荣幸。送R去地铁站的路上,R愉快的和我说,他接下来要找一份测试的工作,这样轻松一点。

2023-06-29 07:36:17 187

原创 如何优雅的写C++代码 Obotcha介绍(简单检测单元测试覆盖率的方法)

Obotcha已经写了快4年的,大约有44K行,4K个接口。对应的单元测试集()目前已经基本涵盖了大多数的模块,但是一直没办法确定有多少接口没有被测到。所以写了个简单的python脚本去做了一个统计。

2022-12-20 21:44:48 166 1

原创 如何优雅的写C++代码 Obotcha介绍(Synchronized实现)

C++实现synchronized

2022-11-05 20:03:28 185

原创 博客如何优雅的写C++代码 Obotcha介绍(ForEveryone函数)

循环遍历一个容器的数据的时候,我们都会使用foreach的语法,或者类似python/rust语言中的for xxx in container的语法,这样用起来非常爽。由于我在obotcha里面自己实现了ArrayList等容器,每次遍历都需要用比较繁琐的iterator

2022-10-30 22:56:12 262

原创 如何优雅的写C++代码 Obotcha介绍(shutdwon函数)

socket shutdown函数

2022-09-12 22:13:36 424

原创 如何优雅的写C++代码 Obotcha介绍(实现读写锁)

C++实现读写锁

2022-09-05 21:48:11 234

原创 如何优雅的写C++代码 Obotcha介绍(字符串转uint8_t)

结果value的数值竟然是49,直接是1的assic码,上网找了一下,貌似很多同学都遇到了这类问题。所以这里就直接用模板类做了区分,针对uint8_t的转化使用模板特例。默认都会走默认操作,uint_8的处理就走下面。

2022-08-21 15:27:53 976

原创 如何优雅的写C++代码 Obotcha介绍(如何解决typedef重定义)

今天遇到一个比较郁闷的问题,Obotcha中用Byte来定义一个Byte实例(类似于java中的Integer),但是在第三方的zlib库中,它有个typedef定义Byte,用来表示unsigned char。所以只要zlib库和Obotcha的Byte.hpp一起include的时候就会出现编译报错。哈哈,下面我们来写一个代码简单表示一下:#include <tuple>#include <type_traits>#include <string>#inc

2022-05-11 21:52:27 338

原创 如何优雅的写C++代码 Obotcha介绍(转载in instantiation of member function requested here异常)

z智能指针和前置声明之间的小问题对比Go等其他语言的工程,C++工程让人痛苦的一件事情就是当工程稍微庞大一点,编译时间就蹭蹭蹭往上爬。一般来说看过Effective C++这本书或者其他类似书籍的人都知道要解决编译时长的问题,就要解决好和头文件之间的依赖关系。所以在任何必要的时候要首先考虑使用前置声明而不是之间include头文件。也就是说,在定义类的时候成员变量如果是自定义类型,可以考虑将其声明为指针类型或者是配合智能指针。函数传参时也是一样,使用指针或者引用。对于一个C工程来说,因为没有智能指.

2022-05-11 21:43:12 1310

原创 Kotlin学习笔记(java.io.IOException: unexpected end of stream on Connection)

这几天一直在用kotlin写app,今天遇到一个OKHttp的异常报错,log中一直打印java.io.IOException: unexpected end of stream on Connection。但是这个web api我用浏览器是OK的,抓了服务器的cap包,发现也是正常的。从网上查找,貌似很多人遇到这类问题,基本方案都是在http header里面添加“connection”为“close”的包头。这样的话,服务器会主动关闭连接,但是这样的话,每次都要重新连接服务器。重新对比看了一下cap

2022-05-06 15:09:22 2729

原创 如何优雅的写C++代码 Obotcha介绍(如何返回多个数据)

我们写函数的时经常会遇到这样的情况,需要返回多个数据,例如:std::string getStudentInfo(int &i) { i = 100; return "wang"}这个函数原本的想法是想获得学生信息(名字,学号),但是返回值只能一个,怎么能同时返回(名字,学号)呢?额,当然,你说返回一个类啥的都可以,但是如果每次都是为了返回值创建一个类,那是不是有点繁琐啊。这里推荐大家使用std::tuple的方法来实现同时返回多个数据的返回数值。方法如下:#inc

2022-04-26 20:26:17 953

原创 如何优雅的写C++代码 Obotcha介绍(使用模板获取class类型)

在使用std::bind的时候,我们经常会遇到这么个提示:error: decltype evaluates to ‘MyFunction&’, which is not a class or enumeration type对应的代码如下using HtmlTemplateFunction = std::function<int(std::vector<int>)>;class MyFunction {public: MyFunction()

2022-04-26 20:09:57 290

原创 如何优雅的写C++代码 Obotcha介绍(智能指针析构)

这个礼拜调试多线程偶现了一个栈溢出的问题:#0 0x55ba07 (/home/sunliwang/mysource/Obotcha/ObotchaTestSuite/testUtil/testConcurrent/testFuture/mytest+0x55ba07)#1 0x7f4008dad147 (../../../../out/lib/libobotcha.so+0x9ea147)#2 0x7f4008dad17f (../../../../out/lib/libobotcha.s

2022-01-18 22:33:52 987

原创 如何优雅的写C++代码 Obotcha介绍(Lambda支持)

  这个春节在家开始优化多线程的代码,发现多线程的使用上比较不方便,例如:我要创建一个线程,需要如下的步骤:1.创建一个Runnable的子类。如果有参数传递,那需要在构造函数中进行赋值DECLARE_SIMPLE_CLASS(RunCase2) IMPLEMENTS(Runnable) {public: _RunCase2(int v) { value = v; } void run() { //xxxxxxxx }private: int RunCas

2021-02-28 20:46:01 121

原创 如何优雅的写C++代码 Obotcha介绍(libco 移植)

这两天,主要干的事情就是研究了一下协程。哈哈,由于我本身是搞嵌入式的,基本上很少碰到用这个东东的。看网上说的这么神奇,貌似服务器上经常用协程来大规模并发时间,所以我决定也把协程引入进Obotcha。PS:最新的C++20貌似也有协程了,但是我现在用的是C++14,呵呵。暂时还木有~。协程库我用了libco,为啥用libco,主要是网上吹嘘说这个库是微信后台使用的,牛叉的很。Libco 是微信后台大规模使用的 C++ 协程库,在 2013 年的时候作为腾讯六大开源项目首次开源。据说 201...

2020-11-12 23:08:14 305

原创 如何优雅的写C++代码 Obotcha介绍(class命名冲突解决方法)

之前使用了google的glog来实现obotcha的log存储,但是最近编译的时候发现一个问题,Obotcha的Mutex类和glog的Mutex类冲突了。glog中Mutex定义如下:#define MUTEX_NAMESPACE glog_internal_namespace_namespace MUTEX_NAMESPACE {class Mutex { public: // Create a Mutex that is not held by anybody. Thi...

2020-09-26 10:08:24 153

原创 如何优雅的写C++代码 Obotcha介绍(简单的反射实现二)

Obotcha的反射基本已经都实现。目前能支持数据库,xml,json的ORM实现。template<typename T>void reflectTo(T obj)template<typename T>void importFrom(T value)JsonValue目前提供如上两个接口,reflectTo是将json数据直接导入到class对象中。importFrom是将class对象数据直接转成json数据。接下来我们看以下reflectTo和imp...

2020-09-20 21:10:38 124

原创 如何优雅的写C++代码 Obotcha介绍(简单的反射实现一)

最近又准备蠢蠢欲动开始写Sql的ORM了。但是ORM遇到的第一个问题就是C++没有反射!!!!。用过Java的同学都知道,使用Java的反射就能实现简单的ORM功能。奈何C++没有,只能自己实现一下了。主要实现代码如下: https://github.com/wangsun1983/Obotcha/blob/master/lang/include/Reflect.hpp 代码中主要的宏定义就是:DECLARE_REFLECT_FIELD#define DECLARE_REF...

2020-08-16 21:17:29 195

原创 如何优雅的写C++代码 Obotcha介绍(String大小写转换优化)

这几天在调试websocket的连接,用perf简单看了一下耗时,发现很大一部分是花费在了String转小写上面(主要原因是http的header我是规定用小写字母作为key存储的)。上网看了一下网上大侠们的推荐,没找到什么好的方案。只有一位大侠说通过简单的比特位操作可以将字母切换大小写,但是遇到标点符号基本就凉了。先上一个C++上通用的转换接口:std::transform(result->m_str.begin(),result->m_str.end(),result->...

2020-07-08 23:01:54 121

原创 如何优雅的写C++代码 Obotcha介绍(Perf调优)

这几天在调试ScheduledThreadPoolThread的大数据并发。测试的case很简单,代码如下: ScheduledExecutorService pool = st(Executors)::newScheduledThreadPool(); long time = st(System)::currentTimeMillis(); for(int i = 0; i < 32*1024;i++) { pool->schedule(crea..

2020-05-24 19:51:54 367

原创 如何优雅的写C++代码 Obotcha介绍(Http Multi Part)

之前几天写过一个http chunk传输的实现,这个主要是用来给服务器下发文件用的。今天介绍的HttpMultiPart主要是用来给客户端上传文件的。个人刚刚接触服务器,不了解是否还有其他方法上传文件,只找到MultiPart这个方法,所以就先实现这个功能再说。先来看一下MultiPart传输的格式://--------WebKitFormBoundaryrGKCBY7qhFd3Tr...

2020-02-25 22:17:28 346

原创 如何优雅的写C++代码 Obotcha介绍(如何重载operator [])

今天我在写代码的时候,发现Java一个很实际的功能,例如java定义一个数组:int mylist[] = new int[25];System.out.println("list size is " + mylist.length); 我们可以方便的读取list的长度,但是C++里面,你定义一个数据,实际上就是分配了一块内存,根本不能从数组上获取任何信息。每次遍历数组数据,...

2020-02-23 12:19:02 174

原创 如何优雅的写C++代码 Obotcha介绍(Http Chunk传输)

2019年年尾遇到点恶心事情,耽搁了一段时间。哈哈,人生感悟就是“仗义每多屠狗辈,负心多是读书人”。哈哈,闲话不说,记下来介绍一个Obotcha的Http Chunk传输的实现方法。 先来复制一段网上的介绍:在进行chunked编码传输时,在回复消息的头部有Transfer-Encoding: chunked编码使用若干个chunk组成,由一个标明长度为0的chun...

2020-02-08 12:20:36 370

原创 如何优雅的写C++代码 Obotcha介绍(WebSocket服务端)

今天主要介绍的websocket服务端的代码。说起websocket的协议,网上有很多很多很多。我这里推荐大家看一下webscoektpp的代码,websocketpp是一套用头文件组成的库,详细介绍如下:WebSocket++ is a header only C++ library that implements RFC6455 The WebSocket Protocol. ...

2019-11-27 21:26:46 155

原创 如何优雅的写C++代码 Obotcha介绍(Valgrind内存泄露调试三)

今天花了点时间调试了ByteArray和String之间的内存泄露。场景如下: 1.TcpServer获取数据以后,直接打包成ByteArray 2.使用ByteArray的时候在转换成String问题1: 结果Valgrind出现了下面的提示==21186== Invalid read of size 1==21186== at 0x4C32D04: st...

2019-10-01 23:00:25 255

原创 如何优雅的写C++代码 Obotcha介绍(Valgrind内存泄露调试二)

昨天发现了pthread_create的一个内存泄露问题,通过添加releaseThread来做了释放处理。今天复测发现仍然有问题:==14387== 304 bytes in 1 blocks are possibly lost in loss record 63 of 63==14387== at 0x4C31B25: calloc (in /usr/lib/valgri...

2019-09-30 23:19:57 401

原创 如何优雅的写C++代码 Obotcha介绍(Valgrind内存泄露调试)

这几天开始测试多线程的内存泄露问题,用到的工具就是Valgrind,这个工具业内还是比较出名的,用来查内存泄露,还是不错的。废话不多说,我们先从安装开始。Ubuntu环境下,运行如下命令sudo apt-get install valgrind安装结束以后就可以愉快的使用了。我们以下面的代码为例:DECLARE_SIMPLE_CLASS(MyThread) IMPLEME...

2019-09-29 21:57:34 169

开源操作系统arale代码

开源操作系统代码,可以在bochs中运行,调试。 github库:https://github.com/wangsun1983/arale

2018-03-23

Android开发环境搭建

Eclipse下Android开发环境的搭建。 呵呵。

2011-09-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除