네, 정상적으로 작동합니다. 그러나 이것은 Semaphore 클래스가 설계된 것이 아닙니다. 코드를 유지하려면 뒤에 오는 가난한 사람을 불쌍히 여기십시오. 그는 모든 Semaphore.WaitOne() 호출이 어디에 있는지 궁금 할 것입니다.
공유 메모리에서 이와 동일한 일을하는 것은 어렵지 않습니다. 여기에 필요한 것은 모두 ...
string mapname = "{EE9D59F3-18F7-4FB6-B76B-AC1E6902BD9B}";
MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen(mapname, sizeof(int));
MemoryMappedViewAccessor mmva = mmf.CreateViewAccessor(0, sizeof(int));
int count = Interlocked.Increment(ref *(int*)p.ToPointer());
그러나 이것은 자랑스럽지 않은 코드입니다./unsafe로 코드를 컴파일해야합니다.
우아한 접근 방식이 없으면 디자인 전제를 다시 방문해야합니다. 왜 처음에는 공유 카운터가 필요합니까? 고유 한 것을 만들려면 각 프로세스에서 GUID를 생성하지 않는 것이 어떻습니까? 합계를 집계하는 경우 서버에 증가분을 게시하는 것이 더 강력한 접근 방법 일 수 있습니다. 당신이 정말로 고성능 계산을 필요로한다면 아마도 C#은 당신의 야망에 맞는 적절한 수단이 아닙니다.
@ScottChamberlain, 나는 그것이 옳다고 생각하지 않는다. 'Release'가 증가하고'WaitOne'이 감소합니다. 나는 지금 LINQPad에서 그것을 테스트했다. –