C++ 为什么(纳秒(1))的睡眠时间在繁忙的等待循环中提高了如此多的性能? 问题:
在实现一个简单的信号量时,我试图以纳秒为单位计算繁忙等待循环和睡眠的平均时间。无论哪种方式,睡眠1纳秒似乎都能达到同样的效果:当我打电话时,会有一个巨大的加速(大约快6倍)C++ 为什么(纳秒(1))的睡眠时间在繁忙的等待循环中提高了如此多的性能? 问题:,c++,multithreading,C++,Multithreading,在实现一个简单的信号量时,我试图以纳秒为单位计算繁忙等待循环和睡眠的平均时间。无论哪种方式,睡眠1纳秒似乎都能达到同样的效果:当我打电话时,会有一个巨大的加速(大约快6倍) std::this_thread::sleep_for(std::chrono::纳秒(1)) …在信号量的p()函数的忙等待循环中 我相信睡眠可以大大减少争论,但我希望有更博学的人给我一个更确定的答案 使用std::this_thread::yield()在执行时间上比简单的自旋锁定更为有利,但仍然具有较高的CPU使用率(
std::this_thread::sleep_for(std::chrono::纳秒(1))代码>
…在信号量的p()
函数的忙等待循环中
我相信睡眠可以大大减少争论,但我希望有更博学的人给我一个更确定的答案
使用std::this_thread::yield()代码>在执行时间上比简单的自旋锁定更为有利,但仍然具有较高的CPU使用率(90-100%)。睡眠法保持在10-15%;线程仍然是交错的,所以不是一个线程执行一行中的所有指令
代码
我尽可能地减少了这个示例,以突出代码的相关部分。在问题的最后,我提供了一个完整实现的演示链接
#include <atomic>
struct semaphore
{
public:
explicit semaphore( int const max_concurrency );
void P()
{
// why does this sleep improve performance so much?
while ( !try_decrease_count() )
std::this_thread::sleep_for( std::chrono::nanoseconds( 1 ) );
}
void V()
{
count_.fetch_add( 1 );
}
private:
bool try_decrease_count();
std::atomic<int> count_;
};
semaphore::semaphore( int const max_count )
: count_{ max_count }
{}
bool semaphore::try_decrease_count()
{
int old_count{ count_.load() };
do
{
if ( !old_count ) return false;
} while ( !count_.compare_exchange_strong( old_count, old_count - 1 ) );
return true;
}
#包括
不带睡眠的演示:打电话是否也有同样的好处?。解释睡眠的行为。@TonyD-yield对(…)
的益处不如sleep\u,但仍然比根本不睡觉/屈服更快。@Gregor-McGregor谢谢你的建议,我会试试的。正如我告诉TonyD的,产量并没有睡眠带来的好处那么多,所以我想知道到底发生了什么。@GregorMcGregor修正了微秒级的困惑;我刚刚用不同的单元测试了一下,看看是否有差异。