我正在编写一个C扩展,提供Ruby和异步I / O库之间的接口。在对我的代码运行测试时,我经常会遇到错误,包括(但不限于):
[BUG] cross-thread violation in rb_thread_schedule()
异步IO意味着我的C扩展需要从多个线程(而不是主解释器线程)向ruby传递消息。如何避免这些线程安全违规?
答案 0 :(得分:7)
对于ruby 1.8.x,避免错误的唯一方法是显而易见的 - 只从主解释器线程调用Ruby / C API。我相信这也适用于ruby 1.9.x,但我还没有使用它,也不知道它的原生线程支持如何改变它。您需要使用生产者/消费者模式将辅助本机线程的请求传递到主解释器线程中的代码,而不是让多个本机线程直接调用API。理想情况下,这样做不会不必要地阻止其他Ruby绿色线程。如果你看一下ruby实现,ruby green thread scheduler必须是一个select()
循环。这表明了以下整体结构:
select()
文件描述符。rb_thread_wait_fd()
。这将允许ruby green thread调度程序运行其他绿色线程。请参阅rb_io_sysread()
(IO#sysread
的实现),了解ruby代码库中最简单的干净IO使用函数。