C-是否可以实现2行代码,以始终在没有锁的多线程程序中以顺序出现


atomic_compare_exchange_strong_explicit(mem, old, new, <mem_order>, <mem_order>);
ftruncate(fd, <size>);

我想要的是,这两行代码总是在没有任何干扰的情况下发生(无锁(。在该CAS之后,应立即调用ftruncate(2(。我读了一个有关记忆订单的小描述,尽管我对它们不太了解。但是他们似乎使这成为可能。有什么办法吗?

您的标题要求按顺序发生的事情。这很容易,C基本上可以使用mo_seq_cst自动完成。CAS的所有可见副作用将出现在ftruncate的任何副作用之前。

(ISO C标准并不是严格要求的,但实际上,实际实施实现了SEQ-CST,除了AARCH64外,STLR不会停滞以排除商店缓冲区,除非/直到有LDAR,否则CST商店仍在商店的缓冲区中。但是系统通话肯定还将包括一个完整的障碍。(

在执行操作的线程中,原子在系统调用之前进行了测序。

您担心什么样的干扰?其他一些线程更改文件的大小?您无法阻止那种比赛状况。

无法将内存 系统调用的操作结合到单个原子事务中。您将需要使用一个假设的系统调用,该系统从原子上完成您想要的。(大概它必须在内核内进行锁定,以进行文件操作,并以一种原子事务的形式进行内存修改。(Linux futex系统在原子上呼叫几件事,但是当然,任何其他操作都没有这样的事情。

或您需要锁定。(或以某种方式暂停过程的所有其他线程。(

最新更新