2011-10-12 171 views
3

我一直在環顧四周,試圖找到一種方法在我的C++程序中以線程安全方式對外部程序進行併發調用。 據我所知,popen,system和fork不是線程安全的。 在我看來,這裏缺少一些東西,我目前還找不到。是否有可能沒有辦法從不同線程向外部程序發出併發呼叫?因爲在我看來,這將是多線程編碼使用的第一個例子之一。 我正在使用linux(mandriva),我希望調用的外部程序可以同時在不同的shell中調用。我對C++並不陌生,但是對於多線程是新手,所以我非常感謝關於這個主題的任何建議。 Marcelo線程安全在C++中併發地調用外部命令

+0

非常感謝所有的答案。事實上,popen解決了這個問題。有幾個鏈接把我扔了,但堆棧溢出總是有最好的信息。 – MeloMCR

回答

2

是什麼讓你認爲popen,system和fork是線程不安全的?從fork上的手冊頁引用:

子進程是使用單個線程創建的 - 稱爲fork()的子進程。父項的整個虛擬地址空間是在子項中複製的 ,包括互斥鎖的狀態, 條件變量以及其他pthreads對象;使用 pthread_atfork(3)可能有助於處理此問題可能導致的問題。

如果您調用系統,您的線程將會阻塞,直到子進程退出。如果你想並行啓動多個外部命令,你可以啓動10個調用系統的線程。

4

fork()是線程安全的,只要你只執行異步信號安全操作(如execve()_exit())的子進程,並只調用waitpid()有一個明確的PID,以避免另一部分「偷」殭屍的程序。 (請注意,你可能會違反前一個要求,但這往往是不可移植和脆弱。在pthread_atfork()接口基本上是由設計打破。)

popen()也是線程安全的,滿足上述兩個要求。

system()可能不是線程安全的,例如因爲它操縱信號處置。

0

除了其他答案之外,就像你在Linux上一樣,你可以使用d-bus和請求/響應協議。也就是說,您的線程只會發送d-bus請求消息,而不必關心同步並以同步或異步方式接收響應。

D-Bus是一種消息總線系統,是應用程序彼此交談的簡單方法。除了進程間通信之外,D-Bus還有助於協調流程生命週期;它使代碼「單一實例」應用程序或守護進程變得簡單可靠,並在需要其服務時按需啓動應用程序和守護進程。