如何使用do while等循环时不阻塞其他代码 实现多内容并行输出
问题原因
- 代码默认在单线程环境下按书写顺序串行执行,前一个for循环未完全执行完毕时,后一个循环的代码不会被调度运行。
- 你预期的交替输出本质是两个循环任务并行执行,单线程场景下无法实现该效果。
解决方法
使用C++11及以上标准库提供的std::thread开启多线程,让两个循环分别在独立线程中并行运行即可,示例代码如下:
#include <iostream> #include <thread> #include <windows.h> // 若为Linux环境替换上面的头文件为 #include <unistd.h>,并将Sleep(1000)改为sleep(1) // 封装第一个循环任务 void loop1() { for (int i = 0; i < 1000; i++) { // 加换行符是为了触发输出缓冲区刷新,避免内容攒堆后一次性输出 std::cout << "hey\n"; Sleep(1000); } } // 封装第二个循环任务 void loop2() { for (int i = 0; i < 1000; i++) { std::cout << "hey number 2\n"; Sleep(1000); } } int main() { // 启动两个独立线程分别执行两个循环 std::thread t1(loop1); std::thread t2(loop2); // 阻塞主线程,等待两个子线程都执行完成后再退出程序 t1.join(); t2.join(); return 0; }
补充说明
如果运行时出现两行输出内容混在同一行的情况,是因为std::cout的输出操作本身不是原子操作,多线程同时输出时会出现竞态条件,可加std::mutex互斥锁保护输出操作即可解决。
如果使用的C版本低于C11,可替换为对应平台原生多线程接口实现:Windows下用CreateThread,Linux下用pthread。
内容的提问来源于stack exchange,提问作者rainbowisrainbow
相关产品推荐
相关产品推荐

