学无止境
环境
本文无特殊说明均指linux环境
std::this_thread::sleep_for和sleep
这哥俩没啥太大区别都是表示当前线程休眠一段时间,休眠期间不与其他线程竞争CPU,根据函数参数,等待相应时间时间。只是一个是C的函数一个是c++的函数分别对应头文件 <unistd.h> 和 < thread >
std::this_thread::yield
当前线程放弃执行,操作系统调度另一线程继续执行。即当前线程将未使用完的“CPU时间片”让给其他线程使用,等其他线程使用完后再与其他线程一起竞争"CPU"。
上代码:
// 全局变量可被别的线程改为true
bool check = false;
bool fun()
{
while (true) {
if (check) {
return true;
}
std::this_thread::yield();
}
......
}
不加std::this_thread::yield()
此函数应用场景如代码所示,我需要轮询检查全局变量check值是否为真。我是搞嵌入式的,板子一般都是单核的。所谓的多线程只不过是内核玩的时间片小把戏。所以上述代码的执行过程实际为在其分配的时间片上重复的while循环,假如一个时间片分配的时间是100ms,一次while循环判断需要消耗20ms。因为是单核,在这100ms内。当此函数所在线程拿到时间片时会进行5次查询check的值,其他线程不得执行,所以check的值根被就不会变。这样就白白浪费了4次循环。
加std::this_thread::yield()
加上此函数后当第一循环进入后判断check的值为假,则通过std::this_thread::yield()把自己剩余的时间片(还是80ms)让出去,让下一个等待的就绪态线程执行这剩下的80ms,并且此过程是利用余下时间片的资源而不是结束当前时间片切换上下文。这样做又减少了切换上下文的调度。
总结
通过今天这个问题,我们在程序设计的时候除了花哨的先进语法。还要考虑自己代码所运行的环境。来设计更合理的框架。这样效率才会更高。
关于线程如何使用时间片问题请点击下方链接
链接: link.