C++ 我可以限制libevent中bufferevents的内存使用吗?
C++ 我可以限制libevent中bufferevents的内存使用吗?,c++,c,multithreading,memory,libevent,C++,C,Multithreading,Memory,Libevent,libevent是否有办法通过buffereventsAPI限制内存使用或未写入的数据?或者,当libevent耗尽内存时会发生什么 我的应用程序从文件中读取数据,对其进行解析,然后通过网络发送数据(下面是伪代码,我的应用程序是C++): 对于文件中的行: 主机=解析主机(行) 套接字[主机]。发送(行) 在前面,我将其分为两个线程,以确保在一台主机运行缓慢时不会不必要地阻止对文件的解析: 对于文件中的行: 主机=解析主机(行) 固定大小的队列[host]。追加(行) while still
libevent
是否有办法通过bufferevents
API限制内存使用或未写入的数据?或者,当libevent耗尽内存时会发生什么
我的应用程序从文件中读取数据,对其进行解析,然后通过网络发送数据(下面是伪代码,我的应用程序是C++):
对于文件中的行:
主机=解析主机(行)
套接字[主机]。发送(行)
在前面,我将其分为两个线程,以确保在一台主机运行缓慢时不会不必要地阻止对文件的解析:
对于文件中的行:
主机=解析主机(行)
固定大小的队列[host]。追加(行)
while stillParsingFile():
sockets.poll(超时=1s)
对于固定大小的队列中的队列:
如果队列不为空且套接字[queue.host]为ReadyForWrite:
套接字[queue.host].send(q.pop())
第二个线程的逻辑非常笨拙,我认为最好使用libevents:
对于文件中的行:
主机=解析主机(行)
bufferevents[主机]。添加(行)
我的理解是,附加到缓冲事件
是非阻塞的(即,它将执行动态内存分配,并将数据异步写入套接字)。如何通过为无法发送的数据分配空间来防止解析线程超过网络速度并填满所有内存
我目前的想法是:
- 使用
减少内存使用(仍然不提供限制,但至少分配应该很小)evbuffer\u add\u reference
- 使用
和自定义锁定,在内存达到上限时强制event\u set\u mem\u函数
阻塞并等待内存(这听起来非常危险,因为只有libevent
仅在添加到libevent
时才执行分配,其他任何地方都不执行此操作)bufferevent
- 在解析线程中,在添加到
之前获取一个锁,并选中evbuffer
;在发送线程中,从evbuffer\u get\u length()
发出低水位写回调信号给解析线程libevent
bufferevent\u setwatermark
。是的,在写下所有看起来显然是赢家的东西之后。不过,我有点希望对libevent更有经验的人有一个更好的解决方案。