Android常用C++特性之std::this_thread

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::this_thread 是 C++11 标准库中的一个命名空间,提供了一组与当前线程(即调用这些函数的线程)相关的操作。通过 std::this_thread,你可以在当前线程上执行一些线程管理操作,例如获取线程 ID、暂停线程、让出 CPU 时间等。

常用的 std::this_thread 函数

  1. 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;
    }
    
  2. 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;
    }
    
  3. 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;
    }
    
  4. 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;
    }
    

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,可以灵活地控制当前线程的行为,尤其在多线程编程中,能有效地控制线程的执行顺序和时机。

void CameraDeviceSession::updateBufferCaches(const hidl_vec<BufferCache>& cachesToRemove) { 1. lock_acquire: 调用 Autolock 将获取锁 this->mInflightLock.mMutex。[显示详情] 1107 Mutex::Autolock _l(mInflightLock); 2. 对 cachesToRemove 的另一元素迭代。 5. 对 cachesToRemove 的另一元素迭代。 1108 for (auto& cache : cachesToRemove) { 1109 auto cbsIt = mCirculatingBuffers.find(cache.streamId); 3. 条件 cbsIt == std::__1::map<int, std::__1::unordered_map<unsigned long long, native_handle const *, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, native_handle const *> > >, std::__1::less<int>, std::__1::allocator<std::__1::pair<int const, std::__1::unordered_map<unsigned long long, native_handle const *, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, native_handle const *> > > > > >::iterator const(this->mCirculatingBuffers.end()),使用了 true 分支。 6. 条件 cbsIt == std::__1::map<int, std::__1::unordered_map<unsigned long long, native_handle const *, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, native_handle const *> > >, std::__1::less<int>, std::__1::allocator<std::__1::pair<int const, std::__1::unordered_map<unsigned long long, native_handle const *, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, native_handle const *> > > > > >::iterator const(this->mCirculatingBuffers.end()),使用了 false 分支。 1110 if (cbsIt == mCirculatingBuffers.end()) { 1111 // The stream could have been removed 4. 继续循环 1112 continue; 1113 } 1114 CirculatingBuffers& cbs = cbsIt->second; 1115 auto it = cbs.find(cache.bufferId); 7. 条件 it != std::__1::unordered_map<unsigned long long, native_handle const *, std::__1::hash<unsigned long long>, std::__1::equal_to<unsigned long long>, std::__1::allocator<std::__1::pair<unsigned long long const, native_handle const *> > >::iterator const(cbs->end()),使用了 true 分支。 1116 if (it != cbs.end()) { CID 171518: (#1 of 1): 持有锁时等待 (SLEEP) 8. sleep: 对 freeBuffer 的调用可能在持有锁 this->mInflightLock.mMutex 的情况下睡眠。[显示详情] 1117 sHandleImporter.freeBuffer(it->second); 1118 cbs.erase(it); 1119 } else { 1120 ALOGE("%s: stream %d buffer %" PRIu64 " is not cached", 1121 __FUNCTION__, cache.streamId, cache.bufferId); 1122 } 1123 } 1124
最新发布
07-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值