1

可能这对你来说是个愚蠢的问题..但它对我不起作用!(WinRT 的新手 .. 也可能是 Windows!)只是尝试创建信号量并尝试获取它.. 没什么特别的。但它失败了 WAIT_FAILED: 5 (Access denied)

void MainPage::simple_Sema_test1()
{

    HANDLE p_sema;
    DWORD ret, err;
    p_sema = CreateSemaphoreEx(NULL, 1, MAX_LIMIT, L"sema1", 0, SEMAPHORE_MODIFY_STATE);
    if(p_sema == NULL)
        print_on_textbox("CreateSemaphoreEx Failed!\n");
    ret = WaitForSingleObjectEx(p_sema, 1000, TRUE);
    switch(ret){
    case WAIT_ABANDONED:
        print_on_textbox("WAIT_ABANDONED\n");
    case WAIT_IO_COMPLETION:
        print_on_textbox("WAIT_IO_COMPLETION\n");
    case WAIT_OBJECT_0:
        print_on_textbox("WAIT_OBJECT_0\n");
    case WAIT_TIMEOUT:
        print_on_textbox("WAIT_TIMEOUT\n");
    case WAIT_FAILED:
        print_on_textbox("WAIT_FAILED: " + (GetLastError()).ToString());
}

编辑 <<<(部分解决)使用 SEMAPHORE_ALL_ACCESS 创建信号量

IE

*sema = CreateSemaphoreEx(NULL, initial, MAX_LIMIT, L"sema1", 0, SEMAPHORE_ALL_ACCESS);

如果有人知道为什么它不适用于修改访问,请解释!

4

1 回答 1

4

要等待同步对象,您必须具有SYNCHRONIZE访问权限

SYNCHRONIZE: 使用对象进行同步的权利。这使线程能够等待,直到对象处于信号状态。

SEMAPHORE_ALL_ACCESS值包括SYNCHRONIZE标志。

于 2012-07-19T23:07:49.367 回答