Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么(纳秒(1))的睡眠时间在繁忙的等待循环中提高了如此多的性能? 问题:_C++_Multithreading - Fatal编程技术网

C++ 为什么(纳秒(1))的睡眠时间在繁忙的等待循环中提高了如此多的性能? 问题:

C++ 为什么(纳秒(1))的睡眠时间在繁忙的等待循环中提高了如此多的性能? 问题:,c++,multithreading,C++,Multithreading,在实现一个简单的信号量时,我试图以纳秒为单位计算繁忙等待循环和睡眠的平均时间。无论哪种方式,睡眠1纳秒似乎都能达到同样的效果:当我打电话时,会有一个巨大的加速(大约快6倍) std::this_thread::sleep_for(std::chrono::纳秒(1)) …在信号量的p()函数的忙等待循环中 我相信睡眠可以大大减少争论,但我希望有更博学的人给我一个更确定的答案 使用std::this_thread::yield()在执行时间上比简单的自旋锁定更为有利,但仍然具有较高的CPU使用率(

在实现一个简单的信号量时,我试图以纳秒为单位计算繁忙等待循环和睡眠的平均时间。无论哪种方式,睡眠1纳秒似乎都能达到同样的效果:当我打电话时,会有一个巨大的加速(大约快6倍)

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修正了微秒级的困惑;我刚刚用不同的单元测试了一下,看看是否有差异。