【问题标题】:OpenSemaphore Success but Access Denied - WinAPIOpenSemaphore 成功但访问被拒绝 - WinAPI
【发布时间】:2013-12-31 01:07:58
【问题描述】:

在主线程中我这样创建信号量

My_Semaphore =  CreateSemaphore(NULL,0,MAX_SEM_COUNT,name);

然后在子线程中打开它

   Test = OpenSemaphore(SYNCHRONIZE, TRUE, name);

GetlastError 返回 0,表示信号量已成功打开,但是当我尝试释放它时

ReleaseSemaphore(name, MAX_SEM_COUNT, NUUL);

GetlastError 返回 5(拒绝访问)。

但如果不是,通过“OpenSemaphore”函数打开信号量,我通过调用“CreatSemaphore”(再次在子线程中)打开它,它工作正常并且没有拒绝访问,

我的代码有什么问题?

【问题讨论】:

  • 除非得到指示,否则切勿致电 GetLastErrorReleaseSemaphore 告诉您如何测试成功/失败以及何时调用 GetLastError
  • 你从 OpenSemaphore 得到的返回值是多少?除非 OpenSemaphore 调用返回 NULL,否则不应使用 GetLastError。
  • OpenSemaphore,给了我信号量的句柄,但不能释放它!
  • SYNCHRONIZE 访问不包括调用 ReleaseSemaphore 的权限。
  • @RaymondChen,你说得对! ,但是我应该如何同时使用 OpenSemaphore 和 ReleaseSemaphore?

标签: multithreading winapi access-denied


【解决方案1】:

lpSemaphoreAttributes [输入,可选] 指向 SECURITY_ATTRIBUTES 结构的指针。如果该参数为NULL,则句柄不能被子进程继承。 结构的 lpSecurityDescriptor 成员指定新信号量的安全描述符。如果此参数为 NULL,则信号量获取默认安全描述符。信号量的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌;来自https://msdn.microsoft.com/en-us/library/windows/desktop/ms682438(v=vs.85).aspx 对于最新版本的 Windows,只需使用 CreateSemaphore

【讨论】:

  • 您的答案格式不正确,主要是从文档中复制粘贴,但您的最后一句话“只需使用 CreateSemaphore()”解决了我的问题。如果你改进你的答案,我会给你我的投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 2016-12-02
  • 2018-03-10
  • 1970-01-01
  • 2014-08-10
相关资源
最近更新 更多