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

时间:2010-02-02 09:57:55

标签: c# c++ process synchronization

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

希望我的问题很清楚 非常感谢,

Adi Barda

3 个答案:

答案 0 :(得分:9)

您可能会使用命名信号量。信号量基本上是一个计数,它允许开发人员限制访问某些资源的线程/进程数。通常它就像那样

  1. 您创建一个最大计数为N的信号量。
  2. N个线程在其上调用等待函数WaitForSingleObject或类似函数,并且每个都在不等待的情况下继续。每次内部信号量计数器出现故障时。
  3. N + 1线程也调用等待函数,但因为我们信号量的内部计数器现在为0,所以必须等待。
  4. 我们的前N个线程之一通过调用ReleaseSemaphore函数释放信号量。此函数增加信号量的内部计数器。
  5. 我们的等待线程现在不必等待,所以它会恢复,但信号量计数器会回到0。
  6. 我认为这不是你想要的方式。所以,你应该:

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

      在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);
      

      在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);
      

      名称和BIG_NUMBERs显然应该相同。

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

答案 1 :(得分:1)

似乎你需要一个命名信号量(CreateSemaphore):http://msdn.microsoft.com/en-us/library/ms682438(VS.85).aspx用于C ++,它适用于递增/递减。

在C#中,你有System.Threading.Semaphore类。

答案 2 :(得分:1)

请查看this thread有关共享内存以进行同步的方法,或here了解有关在.net / c#中进行同步的一些建议。

如果有.net方法可用,它们应该适用于C ++和C#..