And*_*ack 5 c ruby multithreading ruby-c-extension
我正在编写一个C扩展,提供Ruby和异步I/O库之间的接口.在我的代码上运行测试时,我经常会遇到错误,包括(但不限于):
[BUG] cross-thread violation in rb_thread_schedule()
Run Code Online (Sandbox Code Playgroud)
异步IO意味着我的C扩展需要从多个线程(而不是主解释器线程)向ruby传递消息.在此过程中如何避免这些线程安全违规?
对于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使用函数.
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |