无锁多线程程序中是否可以实现2行代码始终按顺序出现?
Is it possible to achieve 2 lines of code to always occur in a order in a multithreaded program without locks?
atomic_compare_exchange_strong_explicit(mem, old, new, <mem_order>, <mem_order>);
ftruncate(fd, <size>);
我想要的只是这两行代码总是在没有任何干扰的情况下发生(WITHOUT USING LOCKS)。在该 CAS 之后,应立即调用 ftruncate(2)。我读了一个关于内存顺序的小描述,虽然我不太了解它们。但他们似乎使这成为可能。有什么办法吗?
你的标题要求事情按顺序发生。这很简单,C 基本上使用 mo_seq_cst
自动完成; CAS 的所有可见 side-effects 将出现在任何来自 ftruncate
.
之前
(ISO C 标准没有严格要求,但在实践中,实际实现实现 seq-cst 具有完整的屏障,除了 AArch64,其中 STLR 不会停止耗尽存储缓冲区 unless/until 有一个 LDAR,而 seq-cst 存储仍在存储缓冲区中。但是系统调用肯定也会包含一个完整的屏障。)
在执行操作的线程中,原子在系统调用之前被排序。
您担心什么样的干扰?其他一些线程改变了文件的大小?你无法阻止这种竞争条件。
无法将对内存的某些操作 + 系统调用组合到单个原子事务中。您将需要使用一个假设的系统调用来自动执行您想要的操作。 (大概它必须在内核内部进行锁定以使文件操作和内存修改显示为一个原子事务。)例如Linux futex
系统调用原子地做了一些事情,但是对于任何其他操作当然没有像这样的事情。
或者您需要锁定。 (或者以某种方式挂起进程的所有其他线程。)
atomic_compare_exchange_strong_explicit(mem, old, new, <mem_order>, <mem_order>);
ftruncate(fd, <size>);
我想要的只是这两行代码总是在没有任何干扰的情况下发生(WITHOUT USING LOCKS)。在该 CAS 之后,应立即调用 ftruncate(2)。我读了一个关于内存顺序的小描述,虽然我不太了解它们。但他们似乎使这成为可能。有什么办法吗?
你的标题要求事情按顺序发生。这很简单,C 基本上使用 mo_seq_cst
自动完成; CAS 的所有可见 side-effects 将出现在任何来自 ftruncate
.
(ISO C 标准没有严格要求,但在实践中,实际实现实现 seq-cst 具有完整的屏障,除了 AArch64,其中 STLR 不会停止耗尽存储缓冲区 unless/until 有一个 LDAR,而 seq-cst 存储仍在存储缓冲区中。但是系统调用肯定也会包含一个完整的屏障。)
在执行操作的线程中,原子在系统调用之前被排序。
您担心什么样的干扰?其他一些线程改变了文件的大小?你无法阻止这种竞争条件。
无法将对内存的某些操作 + 系统调用组合到单个原子事务中。您将需要使用一个假设的系统调用来自动执行您想要的操作。 (大概它必须在内核内部进行锁定以使文件操作和内存修改显示为一个原子事务。)例如Linux futex
系统调用原子地做了一些事情,但是对于任何其他操作当然没有像这样的事情。
或者您需要锁定。 (或者以某种方式挂起进程的所有其他线程。)