绑定多个线程到多个CPU?
Bind multiple threads to multiple CPU?
我有多个线程正在访问相同的数据,让它们线程安全太痛苦了。因此,他们现在被迫 运行 仅在一个 CPU 核心上使用 CPU affinity 并且只有一个线程可以同时 运行ning。
我想知道是否可以将这些线程分组并让它们一起浮动到其他 CPU 核心?这样一来,我就不用为这些线程腾出一个CPU核了。
这是基于Unix/BSD平台
无法在 Windows 上执行此操作。我不知道 Unix/Linux 但我怀疑这是否可能。
请注意,这不会使您的系统线程安全。即使在单处理器机器上,线程安全也是一个问题。
i++
不是原子的。两个线程都可以读取i
,然后计算i+1
,然后写入i
。这会导致更新丢失。
你需要抛弃这种方法。可能,您应该使用全局锁来控制对共享可变状态的访问。这让所有这些担忧都消失了,而且实施起来相当简单。
要么使代码线程安全,要么只使用一个线程。
最简单的解决方案可能是 "one big lock" 模型。使用此模型,一个锁可以保护线程之间共享的所有数据,而不是以线程安全的方式处理。线程一开始总是持有锁。然后您确定线程可以阻塞的所有点并在该阻塞期间释放锁。
我有多个线程正在访问相同的数据,让它们线程安全太痛苦了。因此,他们现在被迫 运行 仅在一个 CPU 核心上使用 CPU affinity 并且只有一个线程可以同时 运行ning。
我想知道是否可以将这些线程分组并让它们一起浮动到其他 CPU 核心?这样一来,我就不用为这些线程腾出一个CPU核了。
这是基于Unix/BSD平台
无法在 Windows 上执行此操作。我不知道 Unix/Linux 但我怀疑这是否可能。
请注意,这不会使您的系统线程安全。即使在单处理器机器上,线程安全也是一个问题。
i++
不是原子的。两个线程都可以读取i
,然后计算i+1
,然后写入i
。这会导致更新丢失。
你需要抛弃这种方法。可能,您应该使用全局锁来控制对共享可变状态的访问。这让所有这些担忧都消失了,而且实施起来相当简单。
要么使代码线程安全,要么只使用一个线程。
最简单的解决方案可能是 "one big lock" 模型。使用此模型,一个锁可以保护线程之间共享的所有数据,而不是以线程安全的方式处理。线程一开始总是持有锁。然后您确定线程可以阻塞的所有点并在该阻塞期间释放锁。