Android常用C++特性之std::this_thread
声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。
std::this_thread
是 C++11 标准库中的一个命名空间,提供了一组与当前线程(即调用这些函数的线程)相关的操作。通过 std::this_thread
,你可以在当前线程上执行一些线程管理操作,例如获取线程 ID、暂停线程、让出 CPU 时间等。
常用的 std::this_thread
函数
-
std::this_thread::get_id()
- 返回当前线程的唯一标识符(
std::thread::id
类型)。 - 该标识符可用于比较不同线程的身份。
#include <iostream> #include <thread> int main() { std::thread::id this_id = std::this_thread::get_id(); std::cout << "Current thread ID: " << this_id << std::endl; return 0; }
- 返回当前线程的唯一标识符(
-
std::this_thread::sleep_for(duration)
- 暂停当前线程执行指定的时间长度。
duration
是一个时间段(例如std::chrono::milliseconds
),表示线程应该暂停的时间。
#include <iostream> #include <thread> #include <chrono> int main() { std::cout << "Sleeping for 2 seconds..." << std::endl; std::this_thread::sleep_for(std::chrono::seconds(2)); // 休眠2秒 std::cout << "Awake now!" << std::endl; return 0; }
-
std::this_thread::sleep_until(time_point)
- 暂停当前线程直到某个时间点。
time_point
是一个表示时间点的对象(如std::chrono::system_clock::now()
)。
#include <iostream> #include <thread> #include <chrono> int main() { auto wake_up_time = std::chrono::system_clock::now() + std::chrono::seconds(3); std::cout << "Sleeping until a certain time point (3 seconds later)..." << std::endl; std::this_thread::sleep_until(wake_up_time); // 暂停直到3秒后 std::cout << "Woke up!" << std::endl; return 0; }
-
std::this_thread::yield()
- 让出当前线程的执行权,允许其他线程获得 CPU 时间。使用
yield()
时,当前线程会被挂起,等待系统调度其他线程,之后可能会再次执行该线程。 - 在多线程环境中,当线程没有重要任务处理时,可以使用
yield()
让出 CPU,以提高其他线程的响应性。
#include <iostream> #include <thread> void task() { for (int i = 0; i < 5; ++i) { std::cout << "Task executing, iteration " << i << std::endl; std::this_thread::yield(); // 让出CPU,让其他线程执行 } } int main() { std::thread t1(task); std::thread t2(task); t1.join(); t2.join(); return 0; }
- 让出当前线程的执行权,允许其他线程获得 CPU 时间。使用
std::this_thread
常见用途
- 线程调试:
get_id()
可以用来打印和识别不同线程的身份,尤其在调试多线程程序时可以更方便地追踪问题。 - 线程同步:
sleep_for()
和sleep_until()
用于在某些场景中强制同步,例如模拟异步操作的延迟、让线程等待某个特定的时间点。 - 线程调度:
yield()
让当前线程暂时让出 CPU 控制权,以便其他等待的线程能够运行,常用于避免忙等待或在某些竞争条件下提高效率。
示例:多线程与休眠
#include <iostream>
#include <thread>
#include <chrono>
void threadTask(int id) {
std::cout << "Thread " << id << " starting..." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(id)); // 每个线程休眠不同时间
std::cout << "Thread " << id << " finished!" << std::endl;
}
int main() {
std::thread t1(threadTask, 1);
std::thread t2(threadTask, 2);
std::thread t3(threadTask, 3);
t1.join();
t2.join();
t3.join();
return 0;
}
输出:
Thread 1 starting...
Thread 2 starting...
Thread 3 starting...
Thread 1 finished!
Thread 2 finished!
Thread 3 finished!
每个线程按照指定的时间休眠并完成工作。
总结
std::this_thread::get_id()
:获取当前线程的唯一 ID。std::this_thread::sleep_for()
:让当前线程暂停执行指定时长。std::this_thread::sleep_until()
:让当前线程暂停执行,直到指定的时间点。std::this_thread::yield()
:让出当前线程的 CPU 时间片,允许其他线程运行。
通过 std::this_thread
,可以灵活地控制当前线程的行为,尤其在多线程编程中,能有效地控制线程的执行顺序和时机。