共享文件夹中两个线程之间的同步
Synchronization between two threads in shared folder
我们有两个线程,一个用于写入,另一个用于删除,还有一个共享目录,其中一个线程创建一个新文件并写入一些消息,但另一个线程延迟扫描该目录并从新文件中读取消息,然后删除它。
所以基本上我明白它应该是同步的,因为如果一个创建了文件但还没有写入并且另一个线程拿走了这个空文件并将删除那么我们就会遇到问题。
但是如果有4kb,创建或写入需要多长时间?
主要问题是我们可以避免同步还是在这种情况下应该同步?
if one created the file but has not written yet and another thread takes this empty file and will remove then we will have a problem
此问题的解决方案是文件永远不会不完整或无效。
先创建文件再填充文件不是原子序列。为了使其对读者来说是原子的,作者应该:
- 在目标目录中创建一个临时文件,例如
<filename>~
。如此命名的临时文件(以 ~
结尾)不得被任何其他进程读取。当有多个竞争编写器时,将 (pid
或 tid
) 和 (tsc
或 nanoseconds since epoch
) 的组合放入临时文件名中,例如<filename>.<pid>.<nsec>~
。在 Linux 上,您可以选择使用 mkstemp
为您创建一个独特的文件。
- 填充
<filename>~
.
- 将
<filename>~
重命名为 <filename>
。不幸的是,在 Linux renameat2
is an atomic filesystem operation, with option RENAME_NOREPLACE
it fails when <filename>
already exists, so that multiple writers can detect this condition and act accordingly. std::rename
上,当 <filename>
已经存在时不需要任何特定行为。
这样当 <filename>
存在时它是完整和有效的。
我们有两个线程,一个用于写入,另一个用于删除,还有一个共享目录,其中一个线程创建一个新文件并写入一些消息,但另一个线程延迟扫描该目录并从新文件中读取消息,然后删除它。
所以基本上我明白它应该是同步的,因为如果一个创建了文件但还没有写入并且另一个线程拿走了这个空文件并将删除那么我们就会遇到问题。
但是如果有4kb,创建或写入需要多长时间?
主要问题是我们可以避免同步还是在这种情况下应该同步?
if one created the file but has not written yet and another thread takes this empty file and will remove then we will have a problem
此问题的解决方案是文件永远不会不完整或无效。
先创建文件再填充文件不是原子序列。为了使其对读者来说是原子的,作者应该:
- 在目标目录中创建一个临时文件,例如
<filename>~
。如此命名的临时文件(以~
结尾)不得被任何其他进程读取。当有多个竞争编写器时,将 (pid
或tid
) 和 (tsc
或nanoseconds since epoch
) 的组合放入临时文件名中,例如<filename>.<pid>.<nsec>~
。在 Linux 上,您可以选择使用mkstemp
为您创建一个独特的文件。 - 填充
<filename>~
. - 将
<filename>~
重命名为<filename>
。不幸的是,在 Linuxrenameat2
is an atomic filesystem operation, with optionRENAME_NOREPLACE
it fails when<filename>
already exists, so that multiple writers can detect this condition and act accordingly.std::rename
上,当<filename>
已经存在时不需要任何特定行为。
这样当 <filename>
存在时它是完整和有效的。