多次同时调用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理内存和数据结构。 请参阅上面链接中的绑定部分。
- 如何存储对函数的引用,以便稍后在node.js C ++插件模块中调用它?
- C#Winforms Socket.IO到NodeJS服务器
- 将任意Javascript数据对象传递给Node.js C ++插件
- 从multithreadingC ++插件callbackNodeJS Javascript函数
- 如何在Node.js中解释和执行asynchronousJavaScript?
- 在浏览器中执行本机代码
- * v8 :: String :: Utf8Value(args – > ToString())不会返回node.js addon参数的string
- 节点缓冲区为字符数组
- 命令行工具在输出后如何更改其输出?