libuv介绍--多线程

本文深入介绍了libuv的线程功能,强调其内部自包含性,线程与事件循环的独立性。libuv的线程API简单,主要包括线程创建和同步原语如互斥锁。示例代码展示了如何使用libuv进行线程创建、同步和异步通信。文章还提到了线程间通信的异步机制uv_async_send,以及在事件循环中的安全使用方法。
摘要由CSDN通过智能技术生成
原文:[url]http://nikhilm.github.com/uvbook/threads.html[/url]

libuv的线程功能的值得注意的方面是它是一个libuv内部自包含的部分。然而其它的特性密切依赖事件循环和回调原则,线程是完全不知的,他们按需求阻塞,信号错误直接通过返回值和,如第一个例子所示,甚至不需要一个运行的事件循环。

libuv的线程API也非常有限,因为在所有平台上线程的语义和语法都是不同的,和不同级别的完整性。

这一章作如下假设:只有一个事件循环,运行在一个线程(主线程)。没有其他线程与事件循环互动(除了使用uv_async_send)。多事件循环包括运行事件循环在不同的线程和管理它们。

核心线程操作

这里没有太多,你只是用 uv_thread_create()启动一个线程,使用uv_thread_join()等待它关闭。

thread-create/main.c

[code]
int main() {
int tracklen = 10;
uv_thread_t hare_id;
uv_thread_t tortoise_id;
uv_thread_create(&hare_id, hare, &tracklen);
uv_thread_create(&tortoise_id, tortoise, &tracklen);

uv_thread_join(&hare_id);
uv_thread_join(&tortoise_id);
return 0;
}
[/code]

小贴士:
在Unix上uv_thread_t只是pthread_t的一个别名,但这是一个实现细节,避免依赖于它总是成立的。

第二个参数是函数作为线程的入口点,最后一个参数是一个void *参数可通过自定义参数到线程。函数hare现在将运行在一个单独的线程,由操作系统优先安排:


thread-create/main.c
[code]
void hare(void *arg) {
int tracklen = *((int *) arg);
while (tracklen) {
tracklen--;
sleep(1);
fprintf(stderr, "Hare ran another step\n");
}
fprintf(stderr, "Hare done running!\n");
}
[/code]

不像pthread_join()那样允许目标线程通过使用第二个参数返回一个值给调用线程,uv_thread_join() 不允许。返回值需要使用 Inter-thread communication。

同步原语

Mutexes互斥锁

互斥函数直接映射到pthread的等价物。

libuv 互斥函数

*处理编写到控制台。SIGWINCH可能并不总是及时交付;libuv只会在当光标被移动时检测尺寸变化。当一个可读的uv_tty_handle用在原始模式,调整控制台缓冲也将触发一个SIGWINCH信号

uv_mutex_init()和uv_mutex_trylock()函数成功时将返回0,错误时返回-1而不是错误代码。

如果libuv已经启用调试编译,uv_mutex_destroy(), uv_mutex_lock() 和 uv_mutex_unlock() 将被错误中止。同样如果错误是非EAGAIN的其它错误,uv_mutex_trylock()将中止。

一些平台支持递归互斥,但你不应该依靠他们。BSD互斥锁的实
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值