多次同时调用uv_write有时不起作用

我正在testing使用libuv开发的简单服务器体系结构。 每当服务器从客户端收到一些东西时,它就会通过'\ r'分割主体,并向所有观察者,每条消息进行广播。

然后,我用来testing的观察者使用相同的原始消息(回显服务器)调用server-> write()方法。

问题是,我每次运行程序,它随机工作或没有。

当它不起作用时,错误信息是:

Assertion failed: (req->write_index < req->nbufs), function uv__write, file src/unix/stream.c, line 869. Abort trap: 6

完整的代码在这里: https : //github.com/ghostec/film

大部分的代码在这个文件中: https : //github.com/ghostec/film/blob/master/server/server.cpp

编辑:显然这是与uv_queue_work内的调用uv_write的事实有关。 由于它们都写入相同的处理程序,如果它们在libuv循环中调用时出现故障,则会发生不良情况。 但是,我不确定我的评估是否正确。

正如在uv_write的文档中提到的uv_write

注意缓冲区指向的内存在调用callback之前必须保持有效。 这也适用于uv_write2()。

另一方面,这是你的代码:

 void Server::write(Message message) { uv_write_t req; uv_buf_t* buf = new uv_buf_t(); buf->base = &(std::vector<char>(message.data.begin(), message.data.end()))[0]; buf->len = message.data.size(); uv_write(&req, message.handle, buf, 1, [](uv_write_t* req, int status) -> void {}); delete buf; } 

特别是,这行代码闻起来:

 buf->base = &(std::vector<char>(message.data.begin(), message.data.end()))[0]; 

还要注意的是, uv_buf同样适用,因此在callback被称为“气味”之前将其删除。 不仅仅是怀疑libuv在内部失败了,我想说你应该感激它的执行效果,并且在每次使用uv_write都不会看到问题,即使你不符合库的要求。


因为你用c++标记了问题,所以我build议你使用现有的一个包装器来为你正确pipe理内存和数据结构。 请参阅上面链接中的绑定部分。