无论使用的Qt的moveToThread还是 std::thread 执行shell命令的时候都会卡住主线程。是怎么回事?怎么避免?
4条回答 默认 最新
关注 我在关山口开摇摇车 晚上好🌙🌙🌙
本答案参考通义千问问题:在Linux C++的子线程中执行shell命令时,主线程会被阻塞。使用Qt的
QThread
或C++标准库中的std::thread
都存在这个问题。原因:
- 子线程执行shell命令(通常是通过系统调用如
system()
、popen()
等)时,shell会阻塞等待命令执行完成。这会导致子线程阻塞,进而影响主线程。 - 主线程和子线程没有正确地同步,主线程可能因为等待子线程结束而被阻塞。
解决方案:
- 异步执行shell命令:
- 使用
std::async
或std::future
来异步执行shell命令,这样主线程不会等待子线程完成。 - 示例代码(使用
std::async
):
- 使用
#include <iostream> #include <future> #include <cstdlib> // system void executeShellCommand(const char* cmd) { std::future<int> result = std::async(std::launch::async, system, cmd); } // 主线程 int main() { std::thread shell_thread(executeShellCommand, "your shell command here"); shell_thread.detach(); // 解除与主线程的关联,允许主线程继续运行 // ...其他主线程任务 }
- 使用管道(pipe):
- 如果shell命令产生的输出不需要立即显示,可以使用管道将输出传递给子进程,这样主线程可以继续执行。
- 示例代码(使用
popen
):
#include <cstdio> #include <string> void executeShellCommand(const std::string& cmd, FILE** pipe) { *pipe = popen(cmd.c_str(), "r"); // r: read mode if (!*pipe) { // handle error } } // 主线程 int main() { FILE* pipe = nullptr; std::thread shell_thread(executeShellCommand, "your shell command here", &pipe); // ...处理子线程返回的管道,例如读取输出 pclose(pipe); // 关闭管道 shell_thread.join(); // 等待子线程结束 // ...其他主线程任务 }
- 使用线程池:
- 如果有多个shell命令需要执行,可以考虑使用线程池来管理这些任务,避免频繁创建和销毁线程。
- 使用第三方库如
std::thread_pool
或自定义线程池实现。
确保在使用上述方法时,正确处理错误和资源管理,以防止内存泄漏等问题。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用- 子线程执行shell命令(通常是通过系统调用如
悬赏问题
- ¥15 对于知识的学以致用的解释
- ¥50 三种调度算法报错 有实例
- ¥15 关于#python#的问题,请各位专家解答!
- ¥200 询问:python实现大地主题正反算的程序设计,有偿
- ¥15 smptlib使用465端口发送邮件失败
- ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
- ¥15 对于squad数据集的基于bert模型的微调
- ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
- ¥20 steam下载游戏占用内存
- ¥15 CST保存项目时失败