【发布时间】:2020-10-15 16:40:37
【问题描述】:
我正在设置一些进程间通信/内存共享,在此过程中,我正在尝试同步内存的初始设置。我希望我的子进程等待父进程完成 - 或者如果它失败,接管:
#include <windows.h>
#include <stdio.h>
//#include <coni
// o.h>
#include <tchar.h>
#include <iostream>
#include "mutex.cpp"
#define LOG(msg) std::cout << msg << std::endl
int _tmain() {
HANDLE hSemaphore; // TODO: REFACTOR UNINITIALISED MEMORY
std::string semaphoreName = std::string("test-semaphore");
SetLastError(NULL);
hSemaphore = CreateSemaphore(
(LPSECURITY_ATTRIBUTES) NULL, // default security attributes
0,
LONG_MAX,
semaphoreName.c_str() // named semaphore
);
if (hSemaphore == NULL) throw std::runtime_error("Failed to obtain mutex: " + semaphoreName);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
LOG("CHILD WAITING FOR SEMAPHORE");
DWORD result = WaitForSingleObject(hSemaphore, 10000);
if (result != WAIT_OBJECT_0) {
switch (result) {
case WAIT_TIMEOUT:
LOG("WAIT TIMED OUT");
break;
case WAIT_FAILED:
// mutex closed
LOG("WAIT FAILED: " + std::to_string(GetLastError()));
break;
case WAIT_ABANDONED:
// program holding mutex crashed / closed without closing mutex
LOG("WAIT ABANDONED");
break;
}
return 1;
}
LOG("CHILD AQUIRED SEMPAHORE");
ReleaseSemaphore(hSemaphore, 1, NULL);
LOG("CHILD RELEASED SEMPAHORE");
return 0;
} else {
LOG("SIMULATING LONG OPERATION - SLEEPING 5 SECONDS");
Sleep(5000);
LOG("OPERATION DONE");
// LOG("RELEASING SEMPAHORE");
// ReleaseSemaphore(hSemaphore, 1, NULL);
// LOG("RELEASED SEMPAHORE");
//
//// hold console-app
// _getch();
LOG("CLOSING SEMAPHORE HANDLE");
CloseHandle(hSemaphore);
LOG("SEMAPHORE HANDLE CLOSED");
return 0;
}
}
如您所见,我已注释掉父级释放信号量并休眠的行 - 相反,我关闭句柄并退出。
我所期望的是等待进程(在父进程之后大约一秒钟开始)得到一个放弃或失败的错误。相反,它只是超时。因此,如果我将超时设置为INFINITE,则该程序将在父级关闭时无限期停止。有谁知道这是否是预期的行为?
当我说父进程和等待进程时,我并不是说等待进程是父进程的子进程;父进程先来(并创建信号量),等待进程等待父进程释放。
【问题讨论】:
-
根据docu,
WAIT_ABANDONED只为互斥量返回。 -
WAIT FAILED只有在将无效句柄传递给WaitForSingleObject的情况下才会得到(无效句柄,不是可等待的对象句柄,句柄没有 SYNCHRONIZE 访问)。另一边关闭自我手柄 - 对您的WaitForSingleObject没有任何影响。WAIT_ABANDONED只为互斥体返回。 -
@RbMm 我现在正在使用互斥锁,
ReleaseMutex不会唤醒WaitForSingleObject(mutexHandle, ...)。谢天谢地,Abandon 现在正在工作 -
@RbMm 释放互斥锁后,无法获取,每次都超时
-
互斥锁只能在这个进程中接收
标签: c++ c multithreading winapi semaphore