我在关山口开摇摇车 2024-02-28 20:52 采纳率: 50%
浏览 7
已结题

Linux C++ 在子线程中执行shell命令,导致主线程卡住了。

无论使用的Qt的moveToThread还是 std::thread 执行shell命令的时候都会卡住主线程。是怎么回事?怎么避免?

  • 写回答

4条回答 默认 最新

  • Kwan的解忧杂货铺 Java领域优质创作者 2024-02-28 20:52
    关注

    我在关山口开摇摇车 晚上好🌙🌙🌙
    本答案参考通义千问

    问题:在Linux C++的子线程中执行shell命令时,主线程会被阻塞。使用Qt的QThread或C++标准库中的std::thread都存在这个问题。

    原因

    • 子线程执行shell命令(通常是通过系统调用如system()popen()等)时,shell会阻塞等待命令执行完成。这会导致子线程阻塞,进而影响主线程。
    • 主线程和子线程没有正确地同步,主线程可能因为等待子线程结束而被阻塞。

    解决方案

    1. 异步执行shell命令
      • 使用std::asyncstd::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(); // 解除与主线程的关联,允许主线程继续运行
        // ...其他主线程任务
    }
    
    1. 使用管道(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(); // 等待子线程结束
        // ...其他主线程任务
    }
    
    1. 使用线程池
      • 如果有多个shell命令需要执行,可以考虑使用线程池来管理这些任务,避免频繁创建和销毁线程。
      • 使用第三方库如std::thread_pool或自定义线程池实现。

    确保在使用上述方法时,正确处理错误和资源管理,以防止内存泄漏等问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月8日
  • 已采纳回答 2月29日
  • 创建了问题 2月28日

悬赏问题

  • ¥15 对于知识的学以致用的解释
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败