MapViewOfFile中的信号量的最佳方法 – C ++

你好StackOverflow的用户。

我一直在从C ++的Win32 API的MapViewOfFile工作,我是一个新手,但我一直在试图为一个mapview文件创build一个信号量,所以一个实例不能复制到它,除非另一个实例已经复制到它,主实例已经读取它。

我得到的想法是创build不同的方法来做到这一点,但我需要知道做到这一点的最佳方法。

1)使用while循环等待mapviewfile为空。
我试图做到以下几点:

mapViewFile = (LPTSTR) MapViewOfFile(mapView, FILE_MAP_ALL_ACCESS,0,0,SH_MAX_MEMORY); if(mapViewFile!=NULL){ // Wait for the mapviewfile to be empty. while(mapViewFile!=""); // This while is only for delay the operation and wait for the mapviewfile it's empty, we don't need any action in this while. CopyMemory((PVOID)mapViewFile,defaultalloc,(_tcslen(defaultalloc) * sizeof(TCHAR))); UnmapViewOfFile(mapViewFile); } CloseHandle(mapView); 

所以,当mapviewfile是空的时候,while被跳过,“secondary”实例复制到它,然后主实例读取它并清空mapviewfile,这会生成一个信号量。

2)使用互斥体
另一种方法是使用CreateMutex的Win32 Api中的互斥体
我还没有与此工作,但我想我可以做这个我想做的事情。


所以,我的问题如下:

  1. 哪种方式最好做我想做的事情? (在1段中解释)
  2. mapviewfile这样做没有问题吗? (记住我想要与主实例通信两个或多个实例)。

这些是问题,谢谢。

您正在寻找同步访问共享资源。 要做到这一点的方法是使用同步对象。 这意味着使用互斥体。

使用互斥意味着你可以做空闲的等待而不是繁忙的循环。 而且你也不需要关心编译器优化掉while循环中mapViewFile的读取。 如果你有多个进程,那么你就有了一个数据竞争,如果没有互斥或者等价的话,你就无法解决这个问题。 您的第一个选项在这种情况下无法工作。

顺便提一句,你需要在while循环测试中使用strcmp 。 这是因为mapViewFile!=""总是评估为真。