我正在编写一个C扩展,提供Ruby和异步I/O库之间的接口。当在我的代码上运行测试时,我经常收到错误,包括(但不限于):
[BUG] cross-thread violation in rb_thread_schedule()异步IO意味着我的C扩展需要从多个线程(而不是主解释器线程)向ruby传递消息。在此过程中,我如何避免这些线程安全冲突?
发布于 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的实现)。
https://stackoverflow.com/questions/3752006
复制相似问题