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

时间:2011-10-12 22:13:40

标签: c++ multithreading

我一直在互联网上寻找一种方法,以便在我的C ++程序中以线程安全的方式对外部程序进行并发调用。 据我所知,popen,system和fork不是线程安全的。 在我看来,这里缺少一些东西,到目前为止我还没有找到。有可能没有办法从不同的线程到外部程序进行并发调用吗?因为在我看来,这将是使用多线程编码的第一个例子之一。 我正在使用linux(mandriva),我希望调用的外部程序可以同时在不同的shell中调用。 我不是C ++的新手,但我是多线程新手,所以我非常感谢有关这个主题的任何建议。 马塞洛

3 个答案:

答案 0 :(得分:4)

只要您只在子进程中执行异步信号安全操作(例如fork()execve())并且只调用_exit()

waitpid()就是线程安全的用一个明确的pid来避免从程序的另一部分“窃取”一个僵尸。 (请注意,您可能会违反前一个要求,但这往往是不可移植且易碎的。pthread_atfork()界面基本上被设计破坏了。)

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

system()可能不是线程安全的,例如因为它操纵信号处理。

答案 1 :(得分:2)

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

  

子进程是使用单个线程创建的 - 就是那个   叫fork()。父级的整个虚拟地址空间是   在孩子身上复制,包括互斥状态,   条件变量和其他pthreads对象;指某东西的用途   pthread_atfork(3)可能有助于处理这个问题   可能导致。

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

答案 2 :(得分:0)

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

  

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