我们有2个申请。一个用C#编写,另一个用C ++编写。我们需要维护这些进程之间共享的计数器(在内存中)。每当其中一个应用程序启动时,它需要检查此计数器并增加它,每次应用程序关闭时都需要减少计数器。如果应用程序使用任务管理器崩溃或关闭,我们还需要减少计数器 我们考虑过使用其中一个OS同步对象,如MUTEX 我的问题:什么样的同步对象最适合跨进程(当一个是C#和另一个C ++时)
希望我的问题很清楚 非常感谢,
Adi Barda
答案 0 :(得分:9)
您可能会使用命名信号量。信号量基本上是一个计数,它允许开发人员限制访问某些资源的线程/进程数。通常它就像那样
WaitForSingleObject
或类似函数,并且每个都在不等待的情况下继续。每次内部信号量计数器出现故障时。ReleaseSemaphore
函数释放信号量。此函数增加信号量的内部计数器。我认为这不是你想要的方式。所以,你应该:
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);
在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#..