“Better code, better life. ”
ARTS打卡第六周
Algorithm
[题目] :https://leetcode-cn.com/problems/remove-duplicate-node-lcci/
[题解] :
class Solution {
public:
ListNode *removeDuplicateNodes(ListNode *head) {
if (head == nullptr) {
return nullptr;
}
unordered_map<int, int> v;
v[head->val]++;
ListNode *cur;
cur = head;
while (cur->next) {
if (v[cur->next->val]) {
cur->next = cur->next->next;
} else {
v[cur->next->val]++;
cur = cur->next;
}
}
return head;
}
};
Review
[文章链接] :http://www.wangafu.net/~nickm/libevent-book/Ref6_bufferevent.html
[笔记] :
概念
大多数时候,除了响应事件之外,应用程序还需要执行一定数量的数据缓冲。例如,当我们想要写入数据时,通常的模式是这样的:
- 把数据放入缓冲区
- 等待socket可写
- 写入尽可能多的数据
- 记录数据写的offset,如果没写完,下次继续写
由于这种模式过于普遍,所以Libevent专门提供了一种机制来做类似的事,于是便有了bufferevent
。
bufferevent
由底层传输(通常是套接字)、读缓冲区和写缓冲区组成。与event
不同,event
是当fd
上有关注的事件发生(通常是可读或者可写)就会调用回调函数,而bufferevent
是在读取或写入足够的数据时调用其用户提供的回调。
类型
Libevent有以下几种不同类型的bufferevent
:
socket-based bufferevents
- 关心流式套接字(TCP)连接数据读写的
bufferevent
asynchronous-IO bufferevents
- Windows环境下的异步IO,使用IOCP作为底层IO模型
filtering bufferevents
- 一个bufferevent,在将传入和传出数据传递给底层bufferevent对象之前对其进行处理,例如压缩或转换数据。
paired bufferevents
- 两个互相传输数据的
bufferevent
evbuffers
每一个bufferevent
都有一个输入缓冲区和输出缓冲区,它们都是evbuffer
类型。当你有数据需要写道bufferevent
中是,你实际上写到了它的输出缓冲区中;当你需要从bufferevent
中读数据时,你实际上是从它的输入缓冲区中读,注意不要记反了。
callbacks
bufferevent
的回调函数也和普通的event
不同,它关心一下类型的事件:
BEV_EVENT_READING
对bufferevent进行读取操作时发生事件
BEV_EVENT_WRITING
对bufferevent
进行写入取操作时发生事件
BEV_EVENT_ERROR
当bufferevent
的某个操作有异常时,发生事件
BEV_EVENT_TIMEOUT
bufferevent
发生超时时,发生时间
BEV_EVENT_EOF
当bufferevent
得到文件结束标志时发生事件
BEV_EVENT_CONNECTED
当一个连接请求正常相应时发生事件
Tips
动态库版本不对导致的问题
本周主要的工作内容是对接CTP接口,中间遇到了一个问题,我的代码在Windows环境下运行正常,但是到了Linux环境在订阅合约后,没有正常收到订阅合约的响应回调,困扰了我半天的时间。
排查下来发现是在Linux环境下使用的动态库版本不对,由于动态库是一种运行时调用的库,它根据相对地址来寻找需要调用的回调函数的起始地址,所以如果版本不一致,就无法成功回调,显现就是调用订阅合约接口后没有办法正常收到行情。
以后工作中遇到类似问题可以第一时间往这方面想!