【C++多线程编程】(六)之 this_thread线程ID获取get_id()、线程休眠sleep_for()|sleep_until()、线程执行权yield()学习

std::this_thread 是 C++ 标准库中提供的一个命名空间,它包含了与当前线程相关的功能。这个命名空间提供了许多与线程操作相关的工具,使得在多线程环境中更容易进行编程。

函数 使用 说明
get_id std::this_thread::get_id() 获取线程id
yield std::this_thread::yield() 放弃线程执行,回到就绪状态
sleep_for std::this_thread::sleep_for(std::chrono::seconds(1)) 休眠暂停1秒
sleep_until 让当前线程休眠直到指定的时间点

get_id( )

std::this_thread::get_id() 返回当前线程的唯一标识符,类型为 std::thread::id。可以用来识别不同的线程。

两种方法获取线程ID

方法一: 利用线程名中的API接口获取(推荐

std::thread myThread(myFunction);
std::thread::id myThreadId = myThread.get_id();

方法二: 在线程函数中利用this_thread返回当前线程的ID

#include 
#include 
#include 

void myFunction() {
    // 获取当前线程的ID
    std::thread::id threadId = std::this_thread::get_id();
    std::cout << "Thread ID inside myFunction: " << threadId << std::endl;
}

int main() {
    // 创建线程
    std::thread myThread(myFunction);
    // 获取当前主线程的ID
    std::thread::id mainThreadId = std::this_thread::get_id();
    std::cout << "Main Thread ID: " << mainThreadId << std::endl;

    // 等待线程执行完成
    myThread.join();

    return 0;
}


yield( )

std::this_thread::yield() 是 C++ 标准库中的一个函数,它的作用是让当前线程放弃其执行权,主动让出 CPU 时间片,以便其他线程有机会执行。具体来说,yield() 函数的调用会导致当前线程进入就绪态,允许调度器在就绪线程中选择另一个线程来执行。

这个函数的原型如下:

namespace std {
    namespace this_thread {
        void yield() noexcept;
    }
}

使用 yield() 的主要场景是在多线程编程中,当一个线程希望让出 CPU 执行权,以便其他线程能够执行。这样可以更好地利用系统资源,提高多线程程序的效率。以下是一个简单的示例,演示了 yield() 的基本用法:

#include 
#include 

void worker() {
    for (int i = 0; i < 5; ++i) {
        std::cout << "Worker: " << i << std::endl;
        std::this_thread::yield(); // 让出执行权
    }
}

int main() {
    
    std::thread workerThread(worker);
    for (int i = 0; i < 5; ++i) {
        std::cout << "Main: " << i << std::endl;
        std::this_thread::yield(); // 让出执行权
    }

    workerThread.join();

    return 0;
}


sleep_for( )

std::this_thread::sleep_for() 让当前线程休眠一段指定的时间。

#include 
#include 
#include 

int main() {
    std::cout << "Sleep for 2 seconds...\n";
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Awake!\n";

    return 0;
}


sleep_until( )

std::this_thread::sleep_until() 用于让当前线程休眠直到指定的时间点。该函数接受一个表示时间点的参数,并在当前线程休眠直到达到或超过该时间点。使用 sleep_until() 可以在程序中实现对时间的精确控制。

以下是 sleep_until() 函数的原型:

namespace std {
    namespace this_thread {
        template<class Clock, class Duration>
        void sleep_until(const chrono::time_point<Clock, Duration>& sleep_time);
    }
}

sleep_until() 接受一个时间点参数,其中 Clock 表示时钟类型,Duration 表示时间间隔类型。通常,ClockDuration 会使用 std::chrono 命名空间中的类型。

下面是一个示例,演示如何使用 sleep_until() 将当前线程休眠至指定时间点:

在这个例子中,sleep_until() 被用来休眠当前线程至指定的时间点。首先获取了当前时间点 now,然后计算了一个未来的时间点 sleep_time(当前时间点之后的5秒),最后通过 sleep_until() 函数实现线程的休眠

#include 
#include 
#include 

int main() {
    // 获取当前时间点
    auto now = std::chrono::system_clock::now();

    // 设置休眠时间为当前时间点之后的5秒
    auto sleep_time = now + std::chrono::seconds(5);

    std::cout << "Sleeping until: " << std::chrono::system_clock::to_time_t(sleep_time) << std::endl;

    // 休眠至指定时间点
    std::this_thread::sleep_until(sleep_time);

    std::cout << "Awake!" << std::endl;

    return 0;
}

你可能感兴趣的:(学习笔记,C++多线程编程学习笔记,学习,笔记,c++,python)