diff --git a/src/threadpool.c b/src/threadpool.c index a449dbf249810440c95e54a8e3adcd23c68ce73c..02638e76ae35c41b695065bb40fc7d11fd6a18e6 100644 --- a/src/threadpool.c +++ b/src/threadpool.c @@ -807,13 +807,14 @@ void uv__ffrt_work(ffrt_executor_task_t* data, ffrt_qos_t qos) if (uv_check_data_valid(loop) == 0) { int status = (w->work == uv__cancelled) ? UV_ECANCELED : 0; struct uv_loop_data* data = (struct uv_loop_data*)loop->data; + uv_mutex_unlock(&loop->wq_mutex); data->post_task_func(data->event_handler, uv__task_done_wrapper, (void*)w, status, qos); } else { uv__loop_internal_fields_t* lfields = uv__get_internal_fields(loop); uv__queue_insert_tail(&(lfields->wq_sub[qos]), &w->wq); + uv_mutex_unlock(&loop->wq_mutex); uv_async_send(&loop->wq_async); } - uv_mutex_unlock(&loop->wq_mutex); rdunlock_closed_uv_loop_rwlock(); }