Sel*_*_va 0 .net c++ synchronization mutex c++-cli
我需要将日志数据写入来自不同进程的单个文件中.
我正在使用Windows Mutex,它需要Common Language Runtime支持.
Mutex^ m = gcnew Mutex( false,"MyMutex" );
m->WaitOne();
//... File Open and Write ..
m->ReleaseMutex()
Run Code Online (Sandbox Code Playgroud)
我真的需要从C++更改为C++/CLI进行同步吗?
如果不使用原子就可以了.但我需要知道,与本地互斥锁相比,使用此互斥锁是否会降低性能.
为获取Mutex类而向您的C++应用程序添加CLR支持是过度的.您可以使用多个选项在两个应用程序之间同步文件访问.
如果需要从多个进程编写文件,使用互斥锁是一种很好的方法.使用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);
}
Run Code Online (Sandbox Code Playgroud)
正如另一个答案所指出的,您需要使用共享打开文件,以便您的两个应用程序可以立即打开它.但是,这本身可能还不够:如果您的两个应用程序都试图写入文件的同一区域,那么您仍然需要确保一次只能写入一个应用程序.想象一下,如果两个应用程序都查看文件的大小,那么它们都会尝试同时写入该字节偏移量:即使两者都试图只追加到文件的末尾,它们最终也会相互冲突.
如果你纯粹写到文件的末尾,并且没有尝试读取任何东西或者在文件的最末端以外的任何地方写入,那么你可以使用一种特殊模式,它可以让你不使用互斥锁.如果你打开文件dwDesiredAccess设置为FILE_APPEND_DATA | SYNCHRONIZE 和其他任何东西(不包括FILE_WRITE_DATA),那么操作系统将负责确保最后写入文件的所有数据,以及写入数据的两个应用程序不会覆盖彼此.MSDN上记录了此行为:
如果仅设置了FILE_APPEND_DATA和SYNCHRONIZE标志,则调用者只能写入文件的末尾,并且忽略有关写入文件的任何偏移信息.但是,对于此类写入操作,将根据需要自动扩展该文件.
您可以采取的另LockFile一种方法是使用该方法.使用LockFile(或LockFileEx),您可以让两个应用程序打开文件,并让每个应用程序锁定要写入的文件部分.这为您提供了比互斥锁更多的粒度,允许同时发生非重叠写入.(使用LockFile整个文件会给你同样的基本效果互斥体,与额外的好处,它会防止其他应用程序写入文件,而你这样做.)还有如何使用一个很好的例子,LockFile对Raymond Chen的博客.
| 归档时间: |
|
| 查看次数: |
2396 次 |
| 最近记录: |