c - ruby C 扩展 : run an event loop concurrently

标签 c ruby multithreading event-loop ruby-c-extension

我正在将一个简单的窗口库实现为 Ruby C 扩展。 Windows 有一个进入其 native 事件循环的 handle_events! 方法。

问题是我希望每个窗口和方法 block 有一个事件循环。我希望该方法立即返回并让循环在单独的线程中运行。实现这一目标的最佳方法是什么?

我尝试使用 rb_thread_call_without_gvl 调用事件循环函数,然后使用 rb_thread_call_with_gvl 调用窗口的回调,即 Proc秒。可以找到完整的源代码 here .

它仍然有效,但不像我预期的那样:该方法仍然阻塞。这甚至可以用 Ruby 的线程模型实现吗?

最佳答案

我有同样的问题要解决。由于 rb_thread_call_with_gvl() 在 1.9.2 中被标记为实验性的并且它不是导出的符号,我采用了不同的方法:

我调用了阻塞的 handle_event!从一个单独的线程运行。我使用了第二个 ruby​​ 线程,它阻塞在消息队列上。在消息队列上阻塞时,gvl 被 rb_thread_blocking_region() 释放。

如果现在线程调用handle_event!由于事件而被解除阻塞,它将 Proc 的上行调用所需的所有信息拉到一个队列元素中,并将该元素插入队列。 ruby 线程接收到从 rb_thread_blocking_region() 返回的元素,因此重新获取 gvl 并使用接收到的元素的信息调用 Proc。

亲切的问候 托尔斯滕

关于c - ruby C 扩展 : run an event loop concurrently,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7892258/

相关文章:

ruby-on-rails - 在运行时将模块动态包含到模型中?

java - 两个线程获得相同的值

将 TAB 连接到 gtkEntry

php - 如何在 Linux 服务器上创建类似 Facebook 的体验

c - 使用链接器命令进行 clang 静态分析

javascript - Rails应用程序不会使用 “embedd”附加youtube链接

java - 编写一个包含整数的 ArrayList,该整数将被并发访问

java - 多个线程调用@Cacheable 方法。 Spring 缓存(3.2.6)允许所有线程进入方法

C:寻址链表内部结构

c++ - 格式化 sqlite3_exec 结果