我想找到一种可靠的方法(除了读取内核源代码)来检查给定的操作(或系统调用)是否是原子的(在某种意义上,其他进程只能看到该操作之前或之后的状态, Linux上没有介于两者之间的东西。这样做的目的是避免在某些操作中使用不必要的锁,如果内核已经为我做了那些。
到目前为止,我只能找到关于此主题的this等资源,这绝不是权威性或详尽无遗的。此外,Linux手册页中包含的信息很少。例如,对于上面链接中提到的大多数函数,我在手册页中没有找到关于它们的原子性的任何内容。
有人能告诉我是否有提供此信息的标准或官方文档?任何帮助将不胜感激。
答案 0 :(得分:0)
我认为POSIX线程安全功能是一个很好的起点。线程安全函数是从不同线程调用时会产生相同结果的函数。这与原子问题完全不同,但至少它提供了关于哪些函数当然不是原子函数的提示。
POSIX.1-2001和POSIX.1-2008要求标准中指定的所有函数都是线程安全的,除了一组特定的函数(大多数函数在标准库中实现而不是在内核中实现) )。
作为线程安全但不是原子的函数的示例,请考虑fwrite()
。 fwrite()
将写入pthread锁下的每进程缓冲区,因此它是线程安全的。但是,缓冲区可以在单独的write()
块中刷新,因此其他进程不会将其视为原子写入。