首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在libev事件回调函数中调用一个阻塞函数会阻塞整个应用程序吗?

在libev事件回调函数中调用一个阻塞函数会阻塞整个应用程序吗?
EN

Stack Overflow用户
提问于 2017-03-09 07:29:40
回答 1查看 846关注 0票数 2

我使用libev开发我的事件驱动应用程序。我喜欢在事件内部查询远程mysql服务器。那么,mysql_real_connect是阻塞整个应用程序,还是只阻塞my_read_cb

按照下列代码

代码语言:javascript
运行
复制
my_read_cb(EV_P_ ev_io *w, int revents) {

    mysql_real_connect(*mysql, "host", "user", "pass", "db", 3306, NULL, 0);
}


struct ev_loop *loop = ev_default_loop(0);
ev_io_init(io, my_read_cb, network_fd, EV_READ);
ev_io_start(loop, io);
ev_run(loop, 0);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-14 17:55:25

它阻止整个应用程序,因为回调函数my_read_cb()在与ev_run()函数相同的线程(也称为main)中执行。这就是反应堆模式的工作方式,您的代码应该是“非阻塞的”,这意味着您应该避免任何I/O等待、sleep()调用、互斥等待等。在您的情况下,很难通过各种库(如MySQL驱动程序)来遵循这样的要求。

(至少)有三种方法可以解决这个问题:

  • 接受这样一个事实,即事件循环在时间与时间之间被阻塞。在某些应用程序中,这可能不是什么大问题。
  • 实现前置器模式 --这基本上意味着每个处理程序回调都在与主线程不同的工作线程中执行,因此事件循环不会被阻塞。这就是Node.js所提供的,或者在C世界中,利布夫等等。
  • 找到与事件循环兼容的库的异步/非阻塞实现。你在这里得特别幸运。例如,用于异步DNS解析的https://c-ares.haxx.se (与getaddrinfo系列中的POSIX系统DNS阻塞调用相反)。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42689219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档