Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 开放线程安全吗?_C_Thread Safety_Libc - Fatal编程技术网

C 开放线程安全吗?

C 开放线程安全吗?,c,thread-safety,libc,C,Thread Safety,Libc,如果两个线程同时调用open()可以吗?如何找到这个问题的答案 假设调用在不同的文件上运行,它们的标志可以是O_RDONLY,O_WRONLY,或者两者兼而有之。你在开放阅读吗?那就安全了。如果要打开进行写入,则应同步线程。因为您注意到它们是不同的文件,所以没有问题 两个不同的进程打开两个不同的文件没有什么不同 编辑:正如盖伊在下面的评论中指出的那样,公平地说,情况并非总是如此。这取决于您使用的libc是否是线程安全的。现代版本是关于open()调用的。它取决于操作系统和C运行时库。如果它符合P

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


假设调用在不同的文件上运行,它们的标志可以是
O_RDONLY
O_WRONLY
,或者两者兼而有之。你在开放阅读吗?那就安全了。如果要打开进行写入,则应同步线程。

因为您注意到它们是不同的文件,所以没有问题

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


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

它取决于操作系统和C运行时库。如果它符合POSIX.1-2001或POSIX.1-2008,则它必须是线程安全的,如下所示:


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

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

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


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

此外,sqlite3表示可以在多个线程上打开以进行读取。您是否在同一个文件上调用
open()
?我们需要更多信息…它们是不同的文件,但假设它们的标志可以是O_RDONLY或O_WRONLY或两者兼有。这并不总是正确的。例如,在旧版本的Microsoft C中,运行时库不是线程安全的(不可重入)。我相信Linux/Unix以前也是如此。虽然这是一个公平的观点,但今天我认为你很难找到这种行为。同意。混乱主要是围绕线程和多核系统的引入,在这些系统中,人们开始看到一些东西崩溃了。