同时创建两个具有相同名称的信号量

时间:2019-04-30 15:27:57

标签: c# semaphore

同时创建两个命名的(即系统范围的)信号量时会发生什么?

例如,您这样做:

# This official base image contains node.js and npm
FROM node:7
ARG VERSION=1.0.0
# Copy the application files
WORKDIR /usr/src/app
COPY package.json app.js LICENSE /usr/src/app/
COPY lib /usr/src/app/lib/
LABEL license=MIT \
      version=$VERSION
# Set required environment variables
ENV NODE_ENV production
# Download the required packages for production
RUN npm update
# Make the application run when running the container
CMD ["node", "app.js"]

如果两个应用程序争先尝试打开现有应用程序,但都失败了,并且一个应用程序在另一个应用程序之前到达catch子句,将会发生什么?操作系统是否可以托管两个具有相同名称的系统范围的锁,并将它们视为两个不同的锁? 它不会将这些锁合并为一个,因为那为什么会有一个OpenExisting API?编辑:我认为这是错误的。实际上,这两个锁将合并并视为一个。

这当然是边缘案例的母亲。为什么会发生两个不同的应用程序在完全相同的时间启动并且都最终在同一时间执行OpenExisting调用并最终出现此难题的情况?但是,如果我想针对这种情况做些什么。我可以吗?

编辑:我以为这没有记录,但这里是:https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore.-ctor?view=netframework-4.8#System_Threading_Semaphore__ctor_System_Int32_System_Int32_System_String_

由于信号量已经存在,将发生UnauthorizedAccessException。

因此,我需要一个系统范围的信号量,以便同步对系统范围的信号量的访问。感觉就像是那时候,我希望我的winform始终是最顶层的窗口。

这种情况可以解决吗?

Edit2:我从评论中关注了canton7的链接,发现

“如果需要确定是否创建了命名系统信号量,请改用Semaphore(Int32,Int32,String,Boolean)构造函数重载。”

Edit3:所以,这就是我解决难题所需的条件:

Semaphore sem;

try
{
  sem = Semaphore.OpenExisting("sem1");
}
catch (WaitHandleCannotBeOpenedException)
{
  sem = new Semaphore(0, 1, "sem1");
}

0 个答案:

没有答案