问题描述
使用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_guard
与loop->wq_mutex
一起使用,还是为此创建专用的互斥锁?
Q2:通常,从性能或实用性上来说,从单独的线程中调用uv_queue_work
是否合适?
Q3:与uv_queue_work
和libuv
相比,是否有更轻巧的代码来生成异步代码?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)