【问题标题】:how to set the priority to get the mutex in C/c++如何设置优先级以在 C/C++ 中获取互斥锁
【发布时间】:2011-05-30 09:35:41
【问题描述】:

我有 3 个进程(同等优先级)

  1. P1
  2. P2
  3. P3(定时器)

获取互斥体的优先级如下:P1(1 priority), P2(2 priority), P3(timer)(3 priority)

如果假设p3 来获取互斥锁 然后p2 来等待互斥锁 之后 p1 来了,它也等待互斥锁

如果p3 释放互斥锁,那么p1 应该得到互斥锁而不是p2。

如何在 C 或 C++ 中执行此操作。

注意:所有进程都在具有相同优先级的线程中运行。

操作系统 - Windows Xp

【问题讨论】:

  • 这里有一些语法错误,使问题变得模棱两可。你能解决这个问题吗?
  • 据说(可惜我现在不记得在哪里),即使p1调用WaitForSingleObject(),只有在p2调用WaitForSingleObject()之后,p2仍有可能获得获取p1 之前的互斥锁。所以它更多地取决于操作系统的状态而不是线程的优先级。
  • 问题似乎是关于多处理,而不是多线程。如果这是真的(即您确实要同步三个进程,而不是单个进程中的线程),那么请修复标签。

标签: c++ c windows mutex multiprocessing


【解决方案1】:

由于线程具有相同的优先级,哪个线程获得锁将是相当随意的。看来您想要等待条件变量而不是使用简单的互斥锁。你仍然会有一个互斥锁;条件变量是互斥锁之上的概念。另一种可能性是使用同步屏障。

编辑: 使用 pthreads 接口(C 风格)使用条件变量的示例: https://computing.llnl.gov/tutorials/pthreads/#ConVarSignal

您需要问自己一个重要的问题:在所有这些等待和同步之后,您是否在购买任何东西?使用线程的目的是让一些事情并行运行。如果这没有发生,那么您的多线程应用程序的运行速度比应用程序根本不使用线程时要慢。

【讨论】:

    【解决方案2】:
    SetThreadPriority(
       HANDLE hThread,
       int nPriority
    );
    

    这个函数将设置你的线程的优先级..HANDLE 值你会在创建线程时得到..就像

    :HANDLE hf=_beginthred(abc,0,NULL) 
    

    【讨论】:

      【解决方案3】:

      根据优先级获取锁是deadlocks 的秘诀。 锁定应始终以可预测的顺序完成,否则您将遇到经典的 (A,B)、(B,A) 死锁可能性。

      您将改为使用priority queue 并让锁本身由内核管理。您当然可以使用信号量而不是互斥锁来让内核知道有多少等待线程在排队的项目上唤醒。但是,您仍然希望在访问队列时锁定队列本身

      【讨论】:

      • 能否请您扩展一下您的意思,让锁由内核管理?
      • 而不是让线程告诉内核它们的优先级是什么(它本质上是“争夺”锁),您可以将消息发布到集中队列,并使用同步原语(例如信号量)收到有关新消息的通知 - 操作系统对如何处理优先级和防止线程饥饿有明确的保证或策略。这就是我所说的“让内核处理它”的意思。
      【解决方案4】:

      当您在互斥体上等待时,进程的线程被添加到互斥体等待队列(链表)中,您唯一的机会就是有可能更改队列中的选择行为。也许 Windows 提供了这种可能性,或者队列默认按优先级排序(这是最有可能的)。

      您的进程具有相同的优先级这一事实不是问题,因为线程时间片将是进程和线程优先级的函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-23
        • 1970-01-01
        • 2016-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-31
        相关资源
        最近更新 更多