C++ 为什么带有一个锁的两个线程可以使用超过100%的CPU

C++ 为什么带有一个锁的两个线程可以使用超过100%的CPU,c++,multithreading,c++11,locking,cpu,C++,Multithreading,C++11,Locking,Cpu,我在一台多核机器上工作,操作系统是Ubuntu 我编写了一个C++11代码,如下所示: thread t1([](){ while (true) { lock_guard<mutex> lock(g_mutex); } }); thread t2([](){ while (true) { lock_guard<mutex> lock(g_mutex);

我在一台多核机器上工作,操作系统是Ubuntu

我编写了一个C++11代码,如下所示:

thread t1([](){
        while (true) {
            lock_guard<mutex> lock(g_mutex);
        }
        });
thread t2([](){
        while (true) {
            lock_guard<mutex> lock(g_mutex);
        }
        });

t1.join();
t2.join();
线程t1([])(){
while(true){
锁定保护锁(g_互斥锁);
}
});
螺纹t2([])(){
while(true){
锁定保护锁(g_互斥锁);
}
});
t1.join();
t2.连接();
如你所见,两条线,一把锁。因此,两个线程将被分配到两个核心上,这是肯定的

但是,在执行这个程序之后,我使用
top
检查它对资源的使用情况

我发现CPU的使用率约为180%


据我所知,由于
,任何时候只能执行一个线程。那么,为什么它可以使用超过100%的CPU呢?

百分比是每个核心。因此,一个四核系统可以达到400%。互斥锁在循环中只被锁定了一小部分时间,因此大约有20%的时间在等待,但随后90%的每个核心都在设置和拆除
std::lock\u guard
。如何衡量CPU使用率?当一个线程“执行”时,正如您所说,另一个线程很可能处于错误状态取决于实现,它可能只在某个时间内在自旋锁中等待失败后才进入睡眠状态。假设不由C++定义。当创建两个线程时,它的C++不在它们将要走到哪里或它们将转到两个CPU上。这是OS依赖的。CPU使用情况相同。