- 博客(9)
- 收藏
- 关注
原创 c++ coroutine+lambda注意问题
代码如下:struct no_block_task{ struct promise_type { auto initial_suspend() noexcept { return std::experimental::suspend_never(); } auto final_suspend() noexcept { return std::experimental::suspend_never(); } void unhandled_exception() { std:
2020-11-21 16:55:39
298
原创 自旋锁实现问题
不关抢占的自旋锁假设A线程获得锁后,此时存在B线程并且B线程优先级高,A线程被抢占挂起,B线程尝试访问相同的临界资源,B线程就可能会陷入活锁状态,不断尝试获得锁、失败、尝试获得锁、失败…不关中断的自旋锁假设CPU是单核的,进程获得了锁并访问临界资源,此时被中断,接着执行中断例程,单中断例程也范围相同的临界资源,此时进程就会陷入活锁状态无优先级自旋锁如果CPU处理器很多,就可能出现某些线程一直获取不到锁的情况FIFO的自旋锁排队自旋锁struct spin_lock{ uint32_t
2020-11-19 11:15:23
269
原创 有返回值的函数函数结尾没返回值在clang+llvm下的异常
以下代码用clang++编译#include <stdio.h>int func(){ printf("");}int main(){ func(); return 0;}接着用GDB调试程序,输入r运行程序,出现Program received signal SIGILL, Illegal instruction.执行display /i $pc,发现程序因为执行ud2指令而异常终结。=> 0x4011c5 <_Z4funcv+21>:
2020-11-18 17:41:14
374
原创 GDB调试二
GDB调试一catchpointscatch event 生成一个断点,当event发生时,停止程序运行。event可以是以下命令之一:throw [regexp]rethrow [regexp]catch [regexp]捕捉C++异常,当异常名跟正则表达式regexp匹配时,程序停止运行。exec当调用exec家族函数时,程序停止运行fork当调用fork函数时,程序停止运行vfork当调用vfork函数时,程序停止运行load [regexp]unlo
2020-10-27 11:10:41
374
原创 GRPC-http2
GRPC-http2Chttp2Connector与Chttp2ServerListener客户端通过Chttp2Connector::Connect与服务器发起tcp连接请求,连上后客户端与服务端进行握手(根据用户传入参数判断是否进行tls握手,开启后进行非对称加密的密文交互,最终双方获得一致的对称加密密钥)。握手完成后调用Chttp2Connector::OnHandshakeDone,创建grpc_transport对象,并调用grpc_chttp2_transport_start_reading
2020-10-25 21:02:29
427
原创 GDB调试一
GDB调试一breakpointsbreakpoints可以用break命令设置,内置变量bpnum记录了当前设置的断点号;每次设置断点时,GDB会赋当前最大max_breakpoint_num+1给bpnum记录了当前设置的断点号;每次设置断点时,GDB会赋当前最大max\_breakpoint\_num+1给bpnum记录了当前设置的断点号;每次设置断点时,GDB会赋当前最大max_breakpoint_num+1给bpnum。infos breakpoints可以查看所有的断点。break
2020-10-23 17:40:46
140
原创 一个无锁队列
在github上,发现一个非阻塞多消费者多生产者无锁队列,基于c++11实现,并且只有一个头文件,而这个头文件只有200多行代码。alignas、false sharing和true sharingalignas是c++11的一个关键字,用于内存字节对齐。false sharing,简单来说就是当两个成员变量在同一个cache line时,其中一个成员变量被修改,会导致cache line无效,另一个成员变量就没法享受cache带来的好处了。所以有时候要避免false sharing。true sh
2020-10-09 11:31:11
909
1
原创 GRPC浅析-LockfreeEvent
LockfreeEvent是一个无锁事件类。主要用于epoll模型下读、写和错误事件的触发。void LockfreeEvent::NotifyOn(grpc_closure* closure) { /*cas失败时,再次循环重试*/ while (true) { /* 这里用acquire的原因是,当SetShutdown成功时,会将shutdown_err保存在state_中, * 假设这边检测到状态是已关闭情况,则下面代码会使用到shutdown_err, * 为
2020-10-08 11:07:42
384
原创 GRPC浅析-epoll与IOCP
GRPC浅析-epollepoll是什么epoll是什么epoll是Linux内核一种I/O事件通知机制,可将大量的文件描述符与事件注册到epoll实例上。内部使用红黑树管理文件描述符与事件。
2020-09-28 15:44:34
680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人