c问题中的多线程

时间:2010-06-11 22:19:47

标签: c multithreading

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

即,如果线程2和线程3到达正在等待,而线程1处于关键部分

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

或将发生种族情况?

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

由操作系统决定。在Windows中,没有保证任何给定线程将被唤醒并被授予互斥锁的命令。

答案 3 :(得分:0)

你问的问题是“有界等待”的经典案例,并且通过[烘焙算法]已知有解决方法。1

这里的基本想法是你保留两个计数,第一个是当前的服务号码,另一个是全局计数(类似于有运行号码的面包店)。每当新线程进入(即等待互斥锁)时,增加全局计数并向线程发出票证。然后该线程等待票号,直到当前服务号等于票号。

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

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