我已经从libuv中阅读了tcp-echo-server.c示例,现在我正在基于该示例编写一个小型多线程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
,而不是libuv中的线程api。
答案 0 :(得分:1)
libuv不是线程安全的,因此您需要始终从运行它的同一线程访问该循环。如果要从另一个线程中推送内容,则需要使用uv_async_send
函数,如下所示。
uv_loop_t loop;
uv_async_t async;
...
uv_async_init(loop, &async, [](uv_async_t* handle) {
...
// call uv_write or any uv functions
});
uv_async_send(async);