Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以限制libevent中bufferevents的内存使用吗?_C++_C_Multithreading_Memory_Libevent - Fatal编程技术网

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
    发出低水位写回调信号给解析线程

I spy
bufferevent\u setwatermark
。是的,在写下所有看起来显然是赢家的东西之后。不过,我有点希望对libevent更有经验的人有一个更好的解决方案。