3

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

假设调用在不同的文件上运行,它们的标志可以是O_RDONLYO_WRONLY或两者兼而有之。

4

4 回答 4

5

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

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

于 2011-03-27T20:16:10.300 回答
2

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

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

编辑:公平地说,正如盖伊在下面的评论中指出的那样,情况并非总是如此。这取决于libc您使用的是否是线程安全的。现代的化身是关于open()呼召的。

于 2011-03-27T20:10:42.270 回答
1

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

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

可以想象,一个非常陈旧且陈旧的 C 库可能会提供一个非线程安全的 open(),但您不太可能遇到它。特别是如果您使用 POSIX 线程。

于 2011-03-28T04:57:17.113 回答
-1

这取决于。你打开阅读了吗?然后就安全了。如果您正在打开写作,那么您应该同步线程。

于 2011-03-27T20:00:36.487 回答