【发布时间】:2020-02-21 21:07:35
【问题描述】:
我正在用 C 语言编写一个 ZeroMQ Publisher,它在 while 循环中发送一条消息。我将它的高水印设置为“20”:
int sndhwm = 20;
size_t sndhwm_size = sizeof(sndhwm);
int rc = zmq_setsockopt(publisher, ZMQ_SNDHWM, &sndhwm, sndhwm_size);
我在bind 之前写了这段代码。绑定后,我打印水印的值,只是为了确保它已设置:
int sndhwm2;
size_t sndhwm_size2 = sizeof(sndhwm2);
rc = zmq_getsockopt(publisher, ZMQ_SNDHWM, &sndhwm2, &sndhwm_size2);
printf("sndhwm: %i\n",sndhwm2);
它会正确打印结果。
但是,当我运行程序时,CPU 使用率几乎总是在 100%。
我注意到,如果在每个 send 之后执行 sleep(1),然后 CPU 使用率非常接近 0%,则不会发生这种情况。
这可能是什么问题?为什么CPU核心是100%?和设置的水印有关系吗?
编辑:我使用的是 libzmq3-dev 4.2.5 版。
edit2:抱歉,由于某种原因,我将内存泄漏误认为是 CPU 内核使用率。我相应地编辑了问题。
这是可重现的例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "zhelpers.h"
int main(int argc, char *argv []){
void *context = zmq_ctx_new();
void *publisher = zmq_socket(context, ZMQ_PUB);
char buffer[50];
snprintf(buffer, sizeof(buffer), "tcp://127.0.0.1:5000");
int sndhwm = 20;
size_t sndhwm_size = sizeof(sndhwm);
int rc = zmq_setsockopt(publisher, ZMQ_SNDHWM, &sndhwm, sndhwm_size);
rc = zmq_bind(publisher, buffer);
int sndhwm2;
size_t sndhwm_size2 = sizeof(sndhwm2);
rc = zmq_getsockopt(publisher, ZMQ_SNDHWM, &sndhwm2, &sndhwm_size2);
assert(rc == 0);
while (1){
rc = s_send(publisher, "hello");
//sleep(1);
}
zmq_close(publisher);
zmq_ctx_destroy(context);
return 0;
}
【问题讨论】:
-
也许您也应该在调用 send 的地方发布代码,以及在那里使用/分配的任何相关数据结构(基本上是 minimal reproducible example)。