【发布时间】:2020-04-28 06:58:41
【问题描述】:
#include "boost/smart_ptr/detail/spinlock.hpp"
boost::detail::spinlock lock;
main(){
std::lock_guard<boost::detail::spinlock> guard(lock);
while(true)
{
i=i+100;
}
}
机器详情:
CPU:2
在线 CPU 列表:0,1
每个内核的线程数:1
每个插槽的核心数:2
套接字:1
上面的代码,当我跑的时候:
First instance => 占用了 100% 的 cpu(根据 top 命令)
Second instance => 花费了 97-98%,这两个实例的总和约为 195%-197%
我的假设是,一旦自旋锁获得 cpu,它就不会被 cpu 抢占(它不会被 cpu 通过调度其他线程来切换,此时保持线程(自旋锁定)处于调度状态队列),因此我期待第三个实例失败。 但它运行显示前两个进程线程被抢占了。
我哪里弄错了?
【问题讨论】:
-
请显示minimal reproducible example 以及您正在使用的实际代码。您的示例中的锁没有争用,因此您的代码将直接传递到 while 循环
-
@AlanBirtles 这是我用来测试我的理解的相同代码。结果来自同一段代码。是的,没有争用,但是 spin_lock 的实现不会确保线程的上下文切换根本不会发生,而不管争用如何?争用在这里有什么意义?
-
如果只有一个线程锁定锁,您不妨删除锁。您只是在测量 while 循环的性能
-
@AlanBirtles:对。它会旋转(等待),而不是离开线程,只有当其他线程获得了 CPU 时。所以,理想情况下,我应该测试三个线程在锁上旋转
-
我想你误解了自旋锁是什么。它是一个线程同步原语,不断测试其值以检查它是否已解锁。一旦它被锁定,它不会做任何事情,直到它被解锁。如果没有自旋锁,您的代码的行为将完全相同
标签: c++ multithreading locking spinlock top-command