如果两个线程同时调用open()函数,这样做是否可行?如何找到答案?
假设这些调用在不同的文件上进行,并且它们的标志可以是O_RDONLY、O_WRONLY或两者都有。
如果两个线程同时调用open()函数,这样做是否可行?如何找到答案?
假设这些调用在不同的文件上进行,并且它们的标志可以是O_RDONLY、O_WRONLY或两者都有。
既然您注意到它们是不同的文件,那么就没有问题。
这和两个不同的进程打开两个不同的文件没有什么区别。
编辑:正如 Guy 在下面的评论中指出的那样,这并非总是如此。这取决于您正在使用的libc
是否是线程安全的。现代版本针对open()
调用是线程安全的。
无论它们是指向同一个文件还是不同的文件,这实际上都是一个红鲱鱼。如果你在类Unix操作系统上运行时,当open()是一个直接的系统调用时,答案绝对是肯定的。不同的线程可以同时打开文件(甚至是相同的文件),就像不同的进程一样。
如果你在一个模拟open()的用户空间系统上运行,非线程安全的可能来源是文件描述符表,该表将操作系统返回的文件句柄映射到类Unix open()调用返回的小整数文件描述符。正如另一个帖子所指出的那样,POSIX要求open()是线程安全的,并且由于open()通常实现为提供POSIX兼容性,因此它是安全的。
虽然很有可能会遇到非线程安全的open(),但这种情况只会发生在非常老旧和不稳定的C库中。特别是如果你正在使用POSIX线程。
这要看情况。你是打开来读取吗?那么是安全的。如果你是打开来写入,那么你应该同步线程。
open()
吗?我们需要更多信息... - Nick Bastin