• c++11 yield函数的使用


    yield函数时c++11的新特性,它在std::this_thread::yield命名空间中实现,函数声明如下:

    void yield() noexcept; 

    其作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行

    比如说你的线程需要等待某个操作完成,如果你直接用一个循环不断判断这个操作是否完成就会使得这个线程占满CPU时间,这会造成资源浪费。这时候你可以判断一次操作是否完成,如果没有完成就调用yield交出时间片,过一会儿再来判断是否完成,这样这个线程占用CPU时间会大大减少。,例如:

    while(!isDone()); // Bad
    while(!isDone()) yield(); // Good

    代码示例:

    #include "stdafx.h"
    #include <iostream>  
    #include <chrono>  
    #include <thread> 
    #include <atomic>
    #include <mutex>
    
    std::mutex g_mutex;
    std::atomic<bool> ready(false);
    
    void count1m(int id) 
    {
        while (!ready)// wait until main() sets ready... 
        {             
            //若线程还有没创建的,将当前线程分配的cpu时间片,让调度器安排给其他线程,
            //由于使用了yield函数,在 not Ready 情况下,避免了空循环,在一定程度上,可以提高cpu的利用率
            std::this_thread::yield();
        }
    
        for ( int i = 0; i < 1000000; ++i) {}
    
        std::lock_guard<std::mutex> lock(g_mutex);
        std::cout << "thread : "<< id << std::endl;
    }
    
    int main()
    {
        std::thread threads[10];
    
        std::cout << "race of 10 threads that count to 1 million:
    ";
    
        for (int i = 0; i < 10; ++i)
        {
            threads[i] = std::thread(count1m, i);
        }
    
        ready = true;               // go!
    
        for (auto& th : threads)
        {
            th.join();
        }
    
        std::cout << '
    ';
    
        return 0;
    }
    

    运行结果:
    这里写图片描述

    参考资料:
    http://blog.csdn.net/tanningzhong/article/details/78248258
    http://www.cplusplus.com/reference/thread/this_thread/yield/

  • 相关阅读:
    物体也能正常移动
    同时按住两个键
    连续子数组的最大和Java实现
    Entity Framework基础01
    MVC知识进阶01
    面向对象基础进阶03
    面向对象基础进阶02
    面向对象基础进阶01
    little skill---ping
    SqlServer------范式小结
  • 原文地址:https://www.cnblogs.com/jinxiang1224/p/8468164.html
Copyright © 2020-2023  润新知