2016-11-04 19 views
2

我想找一个可靠的方式(除了读取内核源代码)来检查给定的操作(或系统调用)是否是原子的(从另一个进程只能看到该操作之前或之后的状态)而不是在两者之间)在Linux上。这样做的目的是为了避免在内核已经为我执行某些操作时使用不必要的锁。如何在Linux上检查给定的操作(或系统调用)是否为原子操作?

到目前为止,我只能找到像this这个话题,这绝不是权威或者全面的资源。另外,Linux手册页包含的信息很少。例如,对于上面链接中提到的大多数函数,我在手册页中找不到有关它们的原子性的任何信息。

谁能告诉我,如果有一个标准或正式文件,提供这些信息?任何帮助将非常感激。

+0

我不是Linux内核专家,但我怀疑存在这样的列表。而且你会发现,如果你明天处理你的代码,那么它会有什么帮助,但是从现在起12.43个月内发布的Linux 6.4会改变一些实现;突然你的锁不再需要;或者突然之间,你会需要一个...... – GhostCat

回答

0

我认为POSIX线程安全函数是一个很好的起点。线程安全函数是在从不同线程调用时会得到相同结果的函数。这与原子化并不完全相同,但至少它暗示了哪些函数肯定不是原子的。

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

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

+0

我倾向于认为线程安全性和原子性实际上是非常不同的概念。线程安全意味着当同时从多个线程调用函数时,不存在数据竞争。实现方式,通常意味着函数不使用任何静态或全局变量。然而,就其他线程如何观察其效果而言,这与原子性没有直接关系。另外值得注意的是,要观察一个线程调用的函数的效果,其他线程根本不需要调用相同的函数。如果我的理解错误,请纠正我。 –

+0

这就是为什么我说“是一个很好的起点”。我会更新答案以反映这种区别。 – Arnout

+0

原子操作也是_async-safe_,pthread互斥体不是。特别是,如果一个线程在服务一个信号时持有一个互斥体,异步信号处理程序将无法获取它。 –

相关问题