线程安全并发调用外部命令在c++中

Thread-Safe Concurrent call to external command in c++

本文关键字:c++ 命令 外部 安全 并发 调用 线程      更新时间:2023-10-16

我一直在互联网上寻找一种方法,试图从我的c++程序中以线程安全的方式并发调用外部程序。据我所知,popen、system和fork都不是线程安全的。在我看来,这里好像少了什么东西,而我到目前为止还没能找到。是否有可能没有办法从不同的线程并发调用到外部程序?因为在我看来,这将是使用多线程编码的第一个例子之一。我使用linux (mandriva)和外部程序,我希望调用可以调用在不同的shell在同一时间。我对c++并不陌生,但我对多线程很陌生,所以我会非常感谢任何关于这个主题的建议。马塞洛

fork()是线程安全的,只要您只在子进程中执行异步信号安全操作(如execve()_exit()),并且只使用显式pid调用waitpid(),以避免从程序的另一部分"窃取"僵尸。(请注意,您可能会试图违反前一个要求,但这往往是不可移植和脆弱的。pthread_atfork()接口基本上是被设计破坏的。)

popen()也是线程安全的,满足上述两个要求。

system()可能不是线程安全的,例如,因为它操作信号配置。

是什么让你认为popen, system和fork是线程不安全的?引用自fork的手册页:

子进程是用一个线程创建的调用fork()。父节点的整个虚拟地址空间为在子进程中复制,包括互斥体的状态,条件变量和其他pthreads对象;的使用Pthread_atfork(3)可能有助于处理这类问题会引起.

如果你调用system,你的线程将阻塞,直到子进程退出。如果你想并行启动多个外部命令,你可以启动10个调用system的线程。

除了其他答案之外,由于您在Linux上,您可以只使用d-bus和请求/响应协议。也就是说,你的线程只需发送d-bus请求消息,而不必关心同步,并以同步或异步的方式接收响应。

D-Bus是一个消息总线系统,是应用程序相互通信的一种简单方式。除了进程间通信之外,D-Bus还有助于协调进程生命周期;它使编写"单实例"应用程序或守护进程变得简单可靠,并在需要它们的服务时按需启动应用程序和守护进程。