gpt4 book ai didi

C# 和 C++ 进程间同步

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:16 25 4
gpt4 key购买 nike

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

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

阿迪巴尔达

最佳答案

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

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

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

Names 和 BIG_NUMBERs 显然应该相同。

如果这对您的任务来说还不够,您将不得不查看共享内存并通过命名为互斥来锁定对它的访问,但这有点复杂。

关于C# 和 C++ 进程间同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2183129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com