вызовите uv_write из нескольких потоков, его обратный вызов никогда не будет вызван - PullRequest
0 голосов
/ 23 июня 2019

Я прочитал пример tcp-echo-server.c из libuv, сейчас я пишу небольшой многопоточный tcp-сервер на его основе.

Я использовал uv_default_loop в основномпоток, чтобы принимать соединения, и поместить новое соединение в список.

// main thread
    uv_ip4_addr("0.0.0.0", DEFAULT_PORT, &addr);

    uv_tcp_bind(&server, (const struct sockaddr*)&addr, 0);
    int r = uv_listen((uv_stream_t*) &server, DEFAULT_BACKLOG, OnConnectionCallback);
    if (r)
    {
        ERROR("Listen error %s", uv_strerror(r));
        return;
    }
    uv_run(loop, UV_RUN_DEFAULT);

, а во втором потоке я передаю сообщение всем имеющимся соединениям.

// second thread

    write_req_t *req = (write_req_t*) malloc(sizeof(write_req_t));
    req->buf = uv_buf_init((char *)buffer->data(), buffer->size());
    int r = uv_write((uv_write_t*) req, (uv_stream_t *)this->uv, &req->buf, 1, write_callback);
    if (r)
    {
        ERROR("uv_write error: %s", uv_strerror(ret));
    }

принимаюсоединение работает, чтение с клиента работает, но пишущая часть не работает.код ошибки не сообщается, но его обратный вызов так и не сработал.

Я просмотрел документ, но пока не смог найти никакой подсказки.Что я пропустил?

кстати, я использую std::thread, а не нить api из libuv.

...