Я пишу ZeroMQ Publisher на C, который отправляет одно сообщение в цикле 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%.
![enter image description here](https://i.stack.imgur.com/BuYKI.png)
Я заметил, что этого не происходит, если после каждого send
я выполняю sleep(1)
,а затем загрузка процессора довольно близка к 0%.
В чем здесь может быть проблема? Почему ядро процессора на 100%? Это связано с установленным водяным знаком?
edit: Я использую libzmq3-dev версии 4.2.5.
edit2: Мои извиненияЯ почему-то ошибся с утечкой памяти при использовании ядра процессора. Я соответственно отредактировал вопрос.
Это воспроизводимый пример:
#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;
}