首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何避免Ruby扩展中的跨线程冲突?

如何避免Ruby扩展中的跨线程冲突?
EN

Stack Overflow用户
提问于 2010-09-20 21:39:58
回答 1查看 633关注 0票数 5

我正在编写一个C扩展,提供Ruby和异步I/O库之间的接口。当在我的代码上运行测试时,我经常收到错误,包括(但不限于):

代码语言:javascript
复制
[BUG] cross-thread violation in rb_thread_schedule()

异步IO意味着我的C扩展需要从多个线程(而不是主解释器线程)向ruby传递消息。在此过程中,我如何避免这些线程安全冲突?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-09-21 17:14:27

对于ruby 1.8.x,避免该错误的唯一方法是显而易见的--仅从主解释器线程调用Ruby/C API。我相信这也适用于ruby1.9.x,但我没有使用过它,也不知道它的原生线程支持可能会如何改变事情。与让多个本机线程直接调用API不同,您需要使用生产者/消费者模式将请求从辅助本机线程传递到主解释器线程中的代码。理想情况下,这样做的同时不会不必要地阻塞其他Ruby绿色线程。如果你看一下ruby实现,ruby green线程调度器本质上是一个select()循环。这表明了以下的总体结构:

  • 创建一个管道或其他进程间通信机制,它为本地线程提供了一个真正的select()-able文件,并为它们提供了管道的写入端。
  • 在主解释器线程中,进入一个在读取端调用rb_thread_wait_fd()的事件循环。这将允许ruby绿色线程调度程序运行其他绿色线程。
  • 当辅助本机线程有对主线程的请求时,它们会将这些请求排队并写入管道,从而唤醒运行事件循环的绿色线程。

有关ruby代码库中最简单、干净的IO使用函数的信息,请参阅rb_io_sysread() (IO#sysread的实现)。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3752006

复制
相关文章

相似问题

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