C#和C++在进程之间进行同步

Adi*_*rda 5 c# c++ synchronization process

我们有2个申请.一个用C#编写,另一个用C++编写.我们需要维护这些进程之间共享的计数器(在内存中).每当其中一个应用程序启动时,它需要检查此计数器并增加它,每次应用程序关闭时都需要减少计数器.如果应用程序使用任务管理器崩溃或关闭,我们还需要减少计数器.
我们考虑使用其中一个OS同步对象,如MUTEX.
我的问题:什么样的同步对象最适合跨进程(当一个是C#和另一个C++时)

希望我的问题很明确.
非常感谢你,

阿迪巴尔达

vav*_*ava 9

你可能会忘记命名信号量.信号量基本上是一个计数,它允许开发人员限制访问某些资源的线程/进程数.通常它就是这样的

  1. 您创建一个最大计数N的信号量.
  2. N个线程在它上面调用等待函数,WaitForSingleObject或者类似的,每个线程都在不等待的情况下继续.每次内部信号量计数器出现故障时.
  3. N + 1线程也调用等待函数,但因为我们的信号量的内部计数器现在为0,所以它必须等待.
  4. 我们的前N个线程之一通过调用ReleaseSemaphore函数释放信号量.此函数递增信号量的内部计数器.
  5. 我们的等待线程现在不必等待,所以它恢复,但信号量计数器返回0.

我不认为这是你想要使用它的方式.所以,你应该:

  1. 创建命名信号量,初始计数器设置为零.
  2. 当应用程序启动时,立即释放它,增加计数器.您将在该通话期间获得之前的计数器值.
  3. 当应用程序结束时,调用WaitForSingleObject(hSemaphore, 0),减少计数器.0意味着你不想等待.

这一切都很简单.

在C++中

//create semaphore
HANDLER hSemaphore = CreateSemaphore(NULL, 0, BIG_NUMBER, "My cool semaphore name");
//increase counter
LONG prev_counter;
ReleaseSemaphore(hSemaphore, 1, &prev_counter);
//decrease counter
WaitForSingleObject(hSemaphore, 0);
Run Code Online (Sandbox Code Playgroud)

在C#中

using System.Threading;
//create semaphore
Semaphore sem = new Semaphore(0, BIG_NUMBER, "My cool semaphore name");
//increase counter
int prev_counter = sem.Release(); 
//decrease counter
sem.WaitOne(0);
Run Code Online (Sandbox Code Playgroud)

名称和BIG_NUMBERs显然应该相同.

如果这不足以完成您的任务,您将不得不查看共享内存并通过命名的互斥锁锁定对它的访问权限,但这有点复杂.

  • 事件、互斥体、信号量和时间可以有名称,使它们可以在系统范围内访问。http://msdn.microsoft.com/en-us/library/ms684292%28VS.85%29.aspx (2认同)