gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:56:25 34 4
gpt4 key购买 nike

您好 StackOverflow 的用户。

我一直在使用 C++ 中 Win32 API 的 MapViewOfFile,我是它的新手,但我一直在尝试为 mapview 文件创建一个信号量,所以一个实例不能复制到它,除非另一个实例有已经复制到它并且主实例已经读取了它。



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

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 并将“辅助”实例复制到其中,然后主实例读取它并清空 mapviewfile,这会生成一个信号量。

2) 使用互斥锁
另一种方法是将 Win32 Api 中的互斥量与 CreateMutex
一起使用我还没有用过这个,但我想我可以用它做我想做的事。


所以,我的问题如下:

  1. 做我想做的事最好的方式是什么? (在第 1 段中解释)
  2. mapviewfile 这样做没有问题吗? (请记住,我想与一个主实例通信两个或多个实例)。

就是这些问题,谢谢。

最佳答案

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

使用互斥量意味着您可以进行空闲等待而不是繁忙的循环。而且您也不必担心编译器会优化 while 循环中对 mapViewFile 的读取。而且,如果您有多个进程写入,那么您将遇到一场数据竞争,如果没有互斥体或等效物,您将无法解决。在这种情况下,您的第一个选择永远行不通。

顺便说一下,您需要在 while 循环测试中使用 strcmp。这是因为 mapViewFile!="" 的计算结果始终为真。

关于c++ - MapViewOfFile 中信号量的最佳方法 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15989355/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com