仅仅为了获得 Mutex 类而向 C++ 应用程序添加 CLR 支持是多余的。您可以使用多种选项来同步两个应用程序之间的文件访问。
选项 1:互斥
如果您需要从多个进程写入文件,那么使用互斥体是一个好方法。使用mutex https://msdn.microsoft.com/en-us/library/windows/desktop/ms686927.aspx 功能 https://msdn.microsoft.com/en-us/library/windows/desktop/ms686360.aspx#mutex_functions在 Win32 API 中。 (无论如何,.Net Mutex 类只是这些函数的包装器。)
HANDLE mutex = CreateMutex(NULL, false, "MyMutex");
DWORD waitResult = WaitForSingleObject(mutex, INFINITE);
if (waitResult == WAIT_OBJECT_0)
{
// TODO: Write the file
WriteFile(...);
ReleaseMutex(mutex);
}
正如另一个答案所指出的,您将需要通过共享打开文件,以便您的两个应用程序都可以立即打开它。然而,这本身可能还不够:如果您的两个应用程序都试图写入文件的同一区域,那么您仍然需要确保一次只有一个应用程序写入。想象一下,如果两个应用程序都查看文件的大小,然后都尝试同时写入该字节偏移量:即使两个应用程序都尝试仅附加到文件末尾,但它们最终会互相破坏。
选项 2:仅以追加方式打开
如果您纯粹写入文件末尾,并且从未尝试读取任何内容或写入文件末尾以外的任何位置,那么您可以使用一种特殊模式,它可以让您不使用互斥体。如果您使用以下命令打开文件dwDesiredAccess
set to FILE_APPEND_DATA | SYNCHRONIZE
没有别的(不包括FILE_WRITE_DATA
),然后操作系统将负责确保最后写入文件的所有数据,并且写入数据的两个应用程序不会相互覆盖。此行为记录在MSDN https://msdn.microsoft.com/en-us/library/ff548289.aspx:
如果仅设置了 FILE_APPEND_DATA 和 SYNCHRONIZE 标志,则调用者只能写入文件末尾,并且有关写入文件的任何偏移量信息都将被忽略。但是,该文件将根据此类写入操作的需要自动扩展。
选项 3:锁定文件
您可以采取的另一条途径是使用LockFile
方法。和LockFile https://msdn.microsoft.com/en-us/library/windows/desktop/aa365202.aspx (or LockFileEx https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203.aspx),您可以让两个应用程序都打开该文件,并让每个应用程序锁定它想要写入的文件部分。这为您提供了比互斥体更多的粒度,允许同时发生非重叠写入。 (使用LockFile
在整个文件上会给你带来与互斥锁相同的基本效果,还有一个额外的好处,就是当你这样做时,它会阻止其他应用程序写入文件。)有一个很好的例子说明了如何使用LockFile
on 雷蒙德·陈的博客 https://blogs.msdn.microsoft.com/oldnewthing/20151127-00/?p=92211.