【发布时间】:2021-05-28 05:49:43
【问题描述】:
我想知道是否有人可以解释为什么 Ruby 的 IO::pwrite 函数在文档中被称为是线程安全的:
这有利于结合 IO#seek 和 IO#write,因为它是 atomic,允许多个线程/进程共享同一个 IO 对象 用于在不同位置读取文件
我对原子性的理解是要么全有要么全无,如果引发错误,“事务”将被回滚,因此在这种情况下,文件将以其原始内容关闭(正确吗?)。
然而,原子性并不能保证线程同步,除非rb_thread_io_blocking_region 是同步方法?
这是pwrite函数源码的sn-p,也可以here
n = (ssize_t)rb_thread_io_blocking_region(internal_pwrite_func, &arg, fptr->fd);
if (n < 0) rb_sys_fail_path(fptr->pathv);
rb_str_tmp_frozen_release(str, tmp);
return SSIZET2NUM(n);
}
【问题讨论】:
标签: ruby multithreading io