开放线程安全吗?

时间:2011-03-27 19:59:16

标签: c thread-safety libc

两个线程同时调用open()可以吗?如何找到这个问题的答案?

假设呼叫在不同的文件上运行,其标志可以是O_RDONLYO_WRONLY或两者。

4 个答案:

答案 0 :(得分:5)

这取决于操作系统和C运行时库。如果它符合POSIX.1-2001或POSIX.1-2008,那么它必须是线程安全的,如下所示:http://www.kernel.org/doc/man-pages/online/pages/man7/pthreads.7.html

正如其他人所指出的那样,系统调用可能是线程安全的并不意味着你可以做任何事情并期望这些调用可以为你神奇地解决问题。如果在没有正确同步的情况下从不同的线程写入和读取相同的文件,结果将是不确定的。此上下文中的线程安全性仅意味着将执行读取和写入。另一种思考方式是,您可以获得相同的保证,就像在不同的进程中进行调用一样。每个人都期望系统调用,例如open()是“过程安全”,否则操作系统将毫无用处。

答案 1 :(得分:2)

由于您注意到它们是不同的文件,因此没有问题。

两个不同的进程打开两个不同的文件没有什么不同。

编辑:正如Guy在评论中指出的那样,值得一提的是,并非总是如此。这取决于您使用的libc是否是线程安全的。现代化身是关于open()召唤的。

答案 2 :(得分:1)

他们是同一个文件还是不同文件实际上是红鲱鱼。如果您在类Unix操作系统上运行,当open()是直接系统调用时,答案绝对是肯定的。不同的线程可以同时打开文件(甚至是相同的文件),就像不同的进程一样。

如果您在用户空间中模拟open()的系统上运行,非线程安全的可能来源是文件描述符表,它将OS返回的文件句柄映射到小整数文件描述符类Unix的open()调用返回。正如另一张海报所指出的那样,POSIX要求open()是线程安全的,并且由于open()通常是为了提供POSIX兼容性而实现的,所以它是安全的。

可以想象,一个非常古老且吱吱作响的C库可能提供非线程安全的open(),但是你很可能会遇到它。特别是如果您使用POSIX线程。

答案 3 :(得分:-1)

这取决于。你开放阅读吗?那么它是安全的。如果您要开始写作,那么您应该同步线程。