本文主要是介绍libuv uv_async_t实现多线程通信,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
官网试例链接
通过uv_async_init就可以注册监视器async了,其他线程可以通过uv_async_send发送信号给监视器,通知监视器执行回调函数。根据官网描述,uv_async_send可以多次发送,但是最终只会执行一次回调函数,并且,其是线程不安全的,因此,在多线程处理是要注意同步问题。另外稍微说明一下uv_queue_work的两个回调函数,uv_after_work_cb回调函数只有当uv_work_cb回调执行完成后才会调用。
/* * File: main.c* Author: zc** Created on 2020年6月9日, 下午1:51*/#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
/** */
uv_loop_t *loop;
uv_async_t async;double percentage;void fake_download(uv_work_t *req)
{int size = *((int*) req->data);int downloaded = 0;while (downloaded < size){percentage = downloaded * 100.0 / size;async.data = (void*) &percentage;uv_async_send(&async);sleep(1);downloaded += (200 + random()) % 1000; // can only download max 1000bytes/sec,// but at least a 200;}
}void print_progress(uv_async_t *handle)
{double percentage = *((double*) handle->data);fprintf(stderr, "Downloaded %.2f%%\n", percentage);
}void after(uv_work_t *req, int status)
{fprintf(stderr, "Download complete\n");uv_close((uv_handle_t*) & async, NULL);
}int main()
{loop = uv_default_loop();uv_work_t req;int size = 10240;req.data = (void*) &size;uv_async_init(loop, &async, print_progress);uv_queue_work(loop, &req, fake_download, after);return uv_run(loop, UV_RUN_DEFAULT);
}
这篇关于libuv uv_async_t实现多线程通信的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!