linux - 如何检查给定操作(或系统调用)在 Linux 上是否是原子的?

标签 linux multiprocessing atomic

我想找到一种可靠的方法(除了阅读内核源代码)来检查给定的操作(或系统调用)是否是原子的(在某种意义上其他进程只能看到该操作之前或之后的状态,但不是介于两者之间)在 Linux 上。这样做的目的是避免在内核已经为我做的情况下对某些操作使用不必要的锁。

到目前为止,我只能找到类似 this 的资源关于这个话题,这绝不是权威的或详尽的。此外,Linux 手册页中几乎没有包含这方面的信息。例如,对于上面链接中提到的大多数函数,我在手册页中找不到有关它们原子性的任何信息。

谁能告诉我是否有提供此信息的标准或官方文档?任何帮助将不胜感激。

最佳答案

我认为 POSIX 线程安全函数是一个很好的起点。线程安全函数是从不同线程调用时会给出相同结果的函数。这与原子性完全不同,但至少它给出了关于哪些函数肯定不是原子性的提示。

POSIX.1-2001 和 POSIX.1-2008 要求标准中指定的所有函数都应该是线程安全的,除了一组特定的函数(其中大部分是在标准库中实现的,而不是在内核中实现的) ).

作为线程安全但不是原子的函数的示例,请考虑 fwrite()fwrite() 将在 pthread 锁下写入每个进程的缓冲区,因此它是线程安全的。但是,缓冲区可能会在单独的 write() block 中刷新,因此其他进程不会将其视为原子写入。

关于linux - 如何检查给定操作(或系统调用)在 Linux 上是否是原子的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40417172/

相关文章:

c - linux - mmap 共享最大大小

linux - 在 Linux 上动态设置环境变量

Python 多处理 - 进程终止(不能启动进程两次)

python - Pathos 多处理池 CPickle 错误

c++ - CUDA、互斥量和 atomicCAS()

linux - SVN 连接被拒绝

c - 从内核分配用户空间内存

amazon-web-services - Linux (Ubuntu) 上的 CPU 使用率下降

django - Django Atomic Transaction 是否锁定数据库?

ios - 了解 Xcode 崩溃消息和 @synchronized 指令