【问题标题】:multi thread in c questionc问题中的多线程
【发布时间】:2010-06-17 00:30:41
【问题描述】:

互斥锁是否保证按到达的顺序执行线程?

也就是说,如果线程 2 和线程 3 到达正在等待,而线程 1 处于临界区

如果线程 2 在线程 3 之前到达互斥锁,线程 1 退出临界区后究竟会发生什么,线程 2 将被允许在线程 3 之前进入临界区?

或者会发生竞态条件?

如果不能保证,我该如何解决? (可能要排队?)

【问题讨论】:

  • 我认为使用队列并不难。进入临界区时,只需进入队列并等待直到你被调用。

标签: c multithreading


【解决方案1】:

这种行为必须是您的线程库的实现细节(您没有提到)。不过,我猜大多数线程库都没有做出任何这样的保证。当然,除非等待线程有不同的优先级。

【讨论】:

  • 优先级反转是指较低优先级的线程持有共享资源并减慢较高优先级的线程。
  • @Romain,这与问题(或我的回答)有什么关系?
  • 关于不同优先级线程持有资源的部分
【解决方案2】:

通常线程库不做任何此类保证,因为大多数操作系统不做任何此类保证。线程包装器(通常)不能比本机操作系统线程管理操作做得更好。

【讨论】:

    【解决方案3】:

    这取决于操作系统。在 Windows 中,没有保证任何给定线程将被唤醒并授予互斥锁的顺序。

    【讨论】:

      【解决方案4】:

      您提出的问题是“有界等待”的经典案例,并且有已知的方法可以通过 [Bakery Algorithm] 解决此问题。1

      这里的基本思想是您维护两个计数,第一个是当前服务数量,另一个是全局计数(类似于具有流水号的面包店)。每当一个新线程进入(即在互斥体上等待)时,增加全局计数并向线程发出票证。然后该线程等待票号,直到当前服务号等于票号。

      这样我们可以保持顺序,使得先出现的线程首先获得互斥体。

      我不确定标准库是否在内部以这种方式实现互斥锁,但根据您的需要实现 Bakery 算法并不难。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多