uv_async_send
是线程安全,但 uv_async_init
不是。如果我使用 uv_async_init
在循环的线程中创建一个异步句柄,则可以多次调用uv_async_send
,但是它的回调只会被调用一次。我需要将回调称为与uv_async_send
相同的次数。
但是,当我为另一个线程中的每个回调创建一个异步句柄时,这并不安全。那么,我如何以线程安全的方式使用libuv async句柄?
- 在循环的线程中创建一个单个异步句柄。
- 实现线程安全队列。(libuv不会在其API中暴露一个,但它确实暴露了原始图,例如创建一个,例如
uv_mutex_t
) - 其他线程将项目放在线程安全呼叫中,然后立即致电
uv_async_send
。 - 异步回调删除了队列中的所有待处理项目并处理它们。
uv_async_init不是线程安全的……当我为其他线程中的每个回调创建异步句柄时,这是不安全的……我可以在loop的线程中创建一个异步句柄
看来您误解了术语螺纹安全。这并不意味着您不得从循环线程以外的线程调用uv_async_init()
。这只是意味着您不得从多个线程并行称呼它(不互锁)。