【问题标题】:Producer consumer multiple mutex needed to access critical section?生产者消费者需要多个互斥锁来访问关键部分?
【发布时间】:2014-03-10 09:07:38
【问题描述】:

有 3 个工具。消费者需要 2 个工具来修改缓冲区。如果消费者 A 拿了 2 个工具,消费者 B 拿了 1 个,那么消费者 B 将不得不等待另一个工具发布。

我不确定我是否以正确的方式考虑这个问题。我解释它的方式是我需要 3 个互斥体,而消费者必须将 2 个锁定在 3 个之外,这是正确的想法吗?

我认为我不应该使用信号量,因为我不希望多个线程同时访问共享资源。在正常的生产者消费者问题中,只有 1 个互斥锁,但在这里我需要 3 个中的任何 2 个,我该如何处理?

【问题讨论】:

    标签: c multithreading pthreads producer-consumer


    【解决方案1】:

    是的,您可以使用 3 个互斥锁,但您必须小心避免死锁。为此,您必须建立一个众所周知的获取锁的顺序:例如,始终首先为具有最低标识符的工具获取锁。在这种情况下,避免死锁始终是按相同顺序获取锁的问题。

    一些伪代码:

    pthread_mutex_t locks[3]; // 1 lock for each tool
    
    critical_function() {
        /* Acquire 2 tools, t1 and t2 */
        first = min(t1, t2);
        second = max(t1, t2);
        locks[first].lock();
        locks[second].lock();
        /* Do work... */
        locks[first].unlock();
        locks[second].unlock();
    }
    

    这假设您将 ID 与0-2 范围内的每个工具相关联。

    但请注意,如果您愿意,最多只能有一个生产者/消费者同时工作,因为只有 3 个工具。因此,您可能想改用单个互斥锁,锁定它,获取 2 个工具,完成工作并释放它 - 毕竟,并行性的可能性不大,您最多有一个生产者/消费者在工作,而其他人在工作拿着 1 个工具等待。

    【讨论】:

    • 你是对的,没有并行性。在我的场景中,我有 1 个生产者和 3 个消费者。假设有工具0,工具1,工具2。我想让消费者 A 能够获取其中的任何两个,以便消费者 A 可以使用工具 1 和工具 2。消费者 B 获得工具 0 并等待另一个工具被释放,而消费者 C 没有。当消费者 A 释放工具 1 和工具 2 时,消费者 B 应该能够抓取任何工具、工具 1 或工具 2,或者消费者 C 可能在 B 抓取工具之前抓取两者。我不知道如何处理这个问题,因为没有顺序。
    • @user3400882 好吧,我的回答应该会有所帮助 - 是否有您不理解的特定部分?我展示的方法应该适合这个问题。
    【解决方案2】:

    好吧,首先看看你的共享资源是什么?当然是工具。现在有三个工具,其中两个是工作所必需的。因此,每当消费者想要获得工具时,我们都需要小心。假设函数AcquireTools() 将工具分配给消费者。现在这很容易解决。 首先我们声明一个全局变量mutex并将其初始化为1。然后,

    wait(mutex);   
    AcquireTools();
    //do work
    signal(mutex);
    

    假设消费者A想要这两个工具,它将调用wait(mutex)mutex的值变为0。现在,当消费者A 工作时,消费者B 需要这两个工具。它将调用wait(mutex),但是mutex=0的值,所以它不能继续,直到消费者A发出信号并且mutex的值变回1

    【讨论】:

      猜你喜欢
      • 2014-03-26
      • 2019-05-18
      • 2015-09-25
      • 2020-10-15
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多