创建新文件以避免竞争条件 我需要开发一个C++例程来执行这一看似微不足道的任务:仅当文件不存在时创建文件,否则不做任何操作/提高错误。

创建新文件以避免竞争条件 我需要开发一个C++例程来执行这一看似微不足道的任务:仅当文件不存在时创建文件,否则不做任何操作/提高错误。,c++,c,iostream,stdio,C++,C,Iostream,Stdio,由于我需要避免竞争条件,我想使用“请求原谅而不是许可”原则(即尝试预期操作并检查其是否成功,而不是提前检查前提条件),据我所知,这是实现这一目的的唯一可靠和可移植的方法 不过,在我的案例中,我仍然找不到一种方法来实现它。我能想到的最好办法是在app模式下打开fstream(或fopen使用“a”),使用tellp(C++)或ftell(C)检查输出位置,如果该位置不为零,则中止。然而,这有两个缺点,即如果文件存在,它会被锁定(虽然时间很短),并且修改日期也会改变 我检查了fstream的ios\

由于我需要避免竞争条件,我想使用“请求原谅而不是许可”原则(即尝试预期操作并检查其是否成功,而不是提前检查前提条件),据我所知,这是实现这一目的的唯一可靠和可移植的方法

不过,在我的案例中,我仍然找不到一种方法来实现它。我能想到的最好办法是在
app
模式下打开
fstream
(或
fopen
使用
“a”
),使用
tellp
(C++)或
ftell
(C)检查输出位置,如果该位置不为零,则中止。然而,这有两个缺点,即如果文件存在,它会被锁定(虽然时间很短),并且修改日期也会改变

我检查了
fstream
ios\u base::openmode
的其他可能组合,以及
fopen
mode
字符串,但没有找到适合我需要的选项。C和C++标准库中的进一步搜索以及Boost文件系统证明是不成熟的。 有人能指出一种方法,在不依赖操作系统特定功能的情况下,以稳健的方式(没有附带影响,没有竞争条件)执行我的任务吗? 我的具体问题是在Windows中,但最好使用便携式解决方案

编辑:BitWhistler的回答完全解决了C程序的问题。不过,我惊讶的是,没有C++的惯用解决方案似乎存在。其中一个使用Andrew Henle的“代码”> OAXEXL//COD>属性,这是OS特定的(在Windows中,属性似乎被称为代码>附加OXEXL/<代码>附加下划线),或者单独编译一个C11文件并将其与C++代码链接。此外,获得的文件描述符不能转换为流,除非具有非标准扩展名(例如,GCC的
\uuu gnu\u cxx::stdio\u filebuf
)。我希望将来的C++版本将实现<代码> x \ <代码>子属性,也可能实现相应的<代码> iS::/Cuff>文件流修改器。< /P> < P>新C标准(C2011,这不是C++的一部分)添加了一个新的标准子说明符(“x”),它可以附加到任何“W”说明符(形成“WX”、“WBX”、“W+X”或“W+BX”/“WB+X”)。. 如果文件存在,此子分种器将强制函数失败,而不是覆盖它


来源:

您想避免多个线程或多个进程之间的竞争条件吗?您的操作系统是什么?POSIX提供您想要做的事情。Win32 API允许这样做。我当然知道,我从来没有做过你想做的事。如果多个线程需要写入一个文件,我将输出排队给一个线程,该线程管理该文件并执行所有输出。文件系统上的竞争消失了,调试变得容易多了,管理输出文件(例如限制其大小,每天选择一个新文件)变得微不足道。很抱歉没有澄清:这里可能的竞争条件是我无法控制的外部进程。我完全同意应用程序中的I/O应该由单个线程执行。