在多处理器环境(PC)中,是否有可能将一个Windows进程配置为仅在一个处理器上运行(亲和掩码= 1或SetProcessAffinityMask(GetCurrentProcess(),1)
),但其线程是否在其他处理器上生成?
(问题来自一家公司的讨论,关于使用同步对象(事件,互斥体,信号量)和WinAPI,如WaitForSignleObject
等,特别是SignalObjectAndWait
MSDN状态
“请注意,不保证执行”信号“和”等待“ 作为原子操作。在其他处理器上执行的线程可以 观察线程前第一个对象的信号状态 调用SignalObjectAndWait开始等待第二个对象“
这是否意味着单个处理器保证是原子的?
P.S。 Windows Context Switching是否存在多个处理器或具有更多实际核心的单处理器的差异?
P.P.S。如果我没有使用确切而具体的条款,请耐心等待这个问题 - 这对我来说仍然不是很了解。
答案 0 :(得分:2)
没有
线程可以运行的处理器核心集是进程关联掩码和线程关联掩码的交集。
要获得您描述的行为,可以为主线程设置线程关联掩码,而不是弄乱进程掩码。
对于你的后续问题:如果它不是原子的,那么它不是原子的。共享核心的线程有额外的保证,因为抢占遵循某些规则,但它们非常复杂,因为相对优先级和动态优先级是线程调度中的重要因素。由于复杂性,最好使用适当的同步。
值得注意的是,相同优先级的线程之间的竞争条件当然仍然存在于单核(或单核受限)系统上,但它们的频率要低得多,因此查找和调试起来要困难得多。
答案 1 :(得分:0)
在多处理器环境(PC)中是否有可能将一个Windows进程配置为仅在一个处理器上运行(亲和掩码= 1或SetProcessAffinityMask(GetCurrentProcess(),1)),但是其线程是否在其他处理器上生成?
这是否意味着单个处理器保证是原子的?
一个cpu:你还记得:跑步和留住?好日子! 然后是Unix:多处理,多线程等等。)
注意:的
如果不知道对这个问题的回答,你就不能问一个问题 试着问一些你不知道的事情,这是不可能的!你在问,因为你有答案。看看你的问题。答案很明显。 :)