//外部调用该函数就可以触发一次事件,就好像唤醒一个线程一样。这个函数是线程安全的,同时//也有一个特性:针对一个请求对象,多次调用时只保证至少触发一次,就好像Windows的消息循环//将同类消息合并一样。intuv_async_send(uv_async_t* handle){
uv_loop_t* loop = handle->loop;if(handle->type != UV_ASYNC){/* Can't set errno because that's not thread-safe. */return-1;}/* The user should make sure never to call uv_async_send to a closing or
* closed handle. */assert(!(handle->flags & UV_HANDLE_CLOSING));//用cas原语做了一次锁判断,持有锁的发送一个请求。//那么uv_async_send就可以这么理解:它是线程安全的,发送请求会置位async_sent//在async_sent没有被复位之前,后续请求都会被忽略if(!uv__atomic_exchange_set(&handle->async_sent)){//使用重叠结构发送一个iocp请求,最终触发事件由GetCompletionStatus处理,POST_COMPLETION_FOR_REQ(loop,&handle->async_req);}return0;}