gpt4 book ai didi

c - 使用 Windows 信号量同步 Windows 文件映射

转载 作者:行者123 更新时间:2023-11-30 15:06:26 25 4
gpt4 key购买 nike

我想使用 Windows 信号量向 Windows 文件映射添加同步。因此,一个进程创建文件映射,另一个进程(可能是多个其他进程)可以进入并访问共享的数据。任何人都可以就如何做到这一点提出建议。我已完成以下操作:

在创建文件映射的过程中,我使用了CreateSemaphore并指定了一个名称。在另一个尝试访问数据的进程中,我使用 OpenSemaphore 来获取创建的信号量的句柄,然后调用 WaitForSingleObject,然后打开该值,如果它的WAIT_OBJECT0,我执行工作,并在工作完成后最后调用ReleaseSemaphore。我使用 JNI 共享库在 C 中执行此操作。

问题在于它只是进入了默认情况。还有什么我应该做的,或者我错过了什么吗?

我对 Windows SEM 的工作方式还很陌生,而且找不到具体的例子它们如何在多个进程(无线程)之间工作。如果有人可以提出任何建议,我们将不胜感激。

这是一些代码:

创建文件映射

// create the semaphore here
semaphore = CreateSemaphore(
NULL,
10,
10,
SEMAPHORE_NAME
);

// some semaphore error checking
if (semaphore == NULL) {
printf("Error occured creating semaphore %d\n", GetLastError());
return -1;
}

//create mapping object
mappedFileHandle = CreateFileMapping (
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUFFER_SIZE,
MEMORY_MAPPING_NAME
);

if (mappedFileHandle == NULL) {
printf("Error creating a mapped file: %d", GetLastError());
return -1;
}

// map view of a file into address space of a calling process
buffer = (LPCTSTR) MapViewOfFile (
mappedFileHandle,
FILE_MAP_ALL_ACCESS,
0,
0,
BUFFER_SIZE
);

if (buffer == NULL) {
printf("Could not map view");
CloseHandle(mappedFileHandle);
return -1;
}

CopyMemory(buffer, str, (_tcslen(str) * sizeof(TCHAR))); // problem!!
UnmapViewOfFile(buffer);
CloseHandle(mappedFileHandle);
// CloseHandle(semaphore);

获取数据的处理代码

// try open the semahore
semaphore = OpenSemaphore (
SEMAPHORE_ALL_ACCESS,
NULL,
SEMAPHORE_NAME
);

// some error checking
if (semaphore == NULL) {
printf("Could not open semaphore %d\n", GetLastError());
return -1;
}

waitResult = WaitForSingleObject(
semaphore,
-1 // block
);

// try to open the file mapping -- SHOULD BE DONE ATOMICALLY
// ======================================================================

switch (waitResult) {
case WAIT_OBJECT_0:
printf("Got in wait_result0");
mappedFileHandle = OpenFileMapping (
FILE_MAP_ALL_ACCESS,
FALSE,
MEMORY_MAPPING_NAME
);

if (mappedFileHandle == NULL) {
printf("Could not open file mapping");
return errorForJavaProgram;
}

// read data here, must be a critical region

buffer = (LPTSTR) MapViewOfFile(
mappedFileHandle,
FILE_MAP_ALL_ACCESS,
0,
0,
BUFFER_SIZE
);

if (buffer == NULL) {
printf("Could not map view");
CloseHandle(mappedFileHandle);
return errorForJavaProgram;
}

message = (*env)->NewStringUTF(env, buffer);

if (!ReleaseSemaphore(semaphore, 1, NULL)) {
printf("An error occured releasing the semaphore: %d\n", GetLastError());
return -1;
}
default:
printf("Got to default \n");
} //switch

最佳答案

您的 switch 语句可能会失败。有关 Stack Overflow 上可以找到的众多讨论之一,请参阅 Does case-switch work like this? .

您的代码执行WAIT_OBJECT_0,然后继续执行default 情况。您需要在 WAIT_OBJECT_0 案例的最后添加 breakreturn

关于c - 使用 Windows 信号量同步 Windows 文件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38993489/

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