你好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中的互斥体
我还没有与此工作,但我想我可以做这个我想做的事情。
所以,我的问题如下:
这些是问题,谢谢。
您正在寻找同步访问共享资源。 要做到这一点的方法是使用同步对象。 这意味着使用互斥体。
使用互斥意味着你可以做空闲的等待而不是繁忙的循环。 而且你也不需要关心编译器优化掉while
循环中mapViewFile
的读取。 如果你有多个进程,那么你就有了一个数据竞争,如果没有互斥或者等价的话,你就无法解决这个问题。 您的第一个选项在这种情况下无法工作。
顺便提一句,你需要在while
循环测试中使用strcmp
。 这是因为mapViewFile!=""
总是评估为真。