uv_queue_work`

问题描述

使用libuv的{​​{3}},我遇到了类似以下的断言错误

src/threadpool.c:329: uv__queue_done: Assertion `uv__has_active_reqs(req->loop)' Failed.

在深入研究uv_queue_work()-> uv__req_init()-> uv__req_register()调用路径后,我注意到loop->active_reqs.count计数器增加uv__req_register(并且后来减少了uv__req_unregister),而没有并发保护,即uv-common.h(L207-L218)中的以下代码

#define uv__req_register(loop,req)                                           \
  do {                                                                        \
    (loop)->active_reqs.count++;                                              \
  }                                                                           \
  while (0)

#define uv__req_unregister(loop,req)                                         \
  do {                                                                        \
    assert(uv__has_active_reqs(loop));                                        \
    (loop)->active_reqs.count--;                                              \
  }                                                                           \
  while (0)

我相信这意味着从单独的线程调用uv_queue_work时,我应该实现并发保护。现在的问题是,这样做的正确方法(按书)是什么?

精确地

问题1:我应该将std::lock_guardloop->wq_mutex一起使用,还是为此创建专用的互斥锁?

Q2:通常,从性能或实用性上来说,从单独的线程中调用uv_queue_work是否合适?

Q3:与uv_queue_worklibuv相比,是否有更轻巧的代码生成异步代码

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)