【问题标题】:Mutual excluding and process synchronization; C++互斥与进程同步; C++
【发布时间】:2017-01-25 10:28:41
【问题描述】:

我有 2 个进程同步的问题。我有 3 个 X 进程和 5 个 Y 进程。我还有 2 个资源 - A 和 B。

资源'A'最多可以同时被3个进程使用,并且通过访问资源'B'相互排除是必要的。

处理 X 和 Y:

void processX()
{
    while (1)
    {
        AccessToResource(B);

        AccessToResource(A);
    }
}

void processY()
{
    while (1)
    {
        AccessToResource(A);

        AccessToResource(B);
    }
}

我怎样才能使用信号量、互斥量、事件,最短的方式做到这一点?

现在我有

CSemaphore sem(1,5,L"semaph");

在访问资源之前和之后通过 sem.Lock() 和 sem.Unlock() 使用它,但它不是很好。

【问题讨论】:

  • 所以您不需要同时锁定对 A 和 B 的访问?对每个资源的访问可以与其他资源分开处理吗?
  • 进程 X 和 Y 同时运行。我不知道如何处理它,这是我的第一个任务
  • @Pawel C++ 标准没有进程的概念,标准库没有进程间通信 API。您需要指定您打算在问题中使用的 API。
  • @user2079303 术语“进程”、“信号量”和“互斥量”是众所周知且定义明确的概念。应该可以使用一般概念来回答,而不需要特定的实现或 API。如果 OP 在实施一般技术方面需要帮助,那么 OP 可以发布另一个问题来询问这个问题(当然,还有一个 OP 尝试过的示例,以及该示例的具体问题的描述,以及指向此的链接问题)。
  • @Pawel 您能否更具体地说明您遇到的问题?你说你尝试了一些“但它不是很好”?你是什​​么意思?您是否想要一个通用的答案而不使用特定的实现或 API?您对特定实现或 API 有疑问吗?

标签: c++ process synchronization semaphore


【解决方案1】:

资源'A'最多可以被 3 个进程使用

计数信号量在这里很合适(参见wiki)。它的工作原理如下:

您有一些计数器(因此名称)初始化为 0。每次某个进程拥有资源 A 时,它都会将该信号量增加 1。如果在您的情况下计数达到 3,则意味着已经有 3 个进程使用资源 'A '。在进程完成使用资源“A”后,它会将计数器(semafore)减 1,从而允许其他进程使用该资源。

通过访问资源“B”相互排除是必要的

这里合适的解决方案是mutex(或二进制信号量)。它们的工作方式几乎相同 - mutex 强调拥有资源的区别。

【讨论】:

  • std::mutex 如果 OP 实际上使用的是 processes 而不是线程,则将无济于事。不过,这是一个实现细节,我们真的不知道 OP 是想要一个特定于实现的答案还是一个通用的答案(您提供了)。
  • @Someprogrammerdude 是的,对不起,我只是被 c++ 标签误导了。修正了答案。
  • @Yuriy Ivaskevych 通用答案没问题,具体实现也是如此。我认为这个答案对我来说已经足够了:) 非常感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多