【问题标题】:Why is Ruby's IO#pwrite thread-safe?为什么 Ruby 的 IO#pwrite 是线程安全的?
【发布时间】: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


    【解决方案1】:

    同步由内核(操作系统)执行,而不是 Ruby。

    根据文档,Ruby 的 pwrite 调用 this pwrite 负责同步。

    pwrite 系统调用的行为在here 中描述。具体来说:

    对常规文件的 write() 成功返回后:

    • 从文件中每个字节位置的任何成功的 read() 由该写入修改应返回由指定的数据 write() 直到这样的字节位置再次出现 修改。

    • 任何后续成功的 write() 到同一字节位置 文件应覆盖该文件数据。

    广泛的基本原理更详细地讨论了序列化。

    【讨论】:

      猜你喜欢
      • 2014-09-20
      • 2023-03-30
      • 1970-01-01
      • 2012-11-20
      • 2013-10-11
      • 2020-10-10
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      相关资源
      最近更新 更多