我一直在環顧四周,試圖找到一種方法在我的C++程序中以線程安全方式對外部程序進行併發調用。 據我所知,popen,system和fork不是線程安全的。 在我看來,這裏缺少一些東西,我目前還找不到。是否有可能沒有辦法從不同線程向外部程序發出併發呼叫?因爲在我看來,這將是多線程編碼使用的第一個例子之一。 我正在使用linux(mandriva),我希望調用的外部程序可以同時在不同的shell中調用。我對C++並不陌生,但是對於多線程是新手,所以我非常感謝關於這個主題的任何建議。 Marcelo線程安全在C++中併發地調用外部命令
3
A
回答
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還有助於協調流程生命週期;它使代碼「單一實例」應用程序或守護進程變得簡單可靠,並在需要其服務時按需啓動應用程序和守護進程。
相關問題
- 1. 在python中調用外部命令並將值插入命令
- 2. 在GO中調用外部命令
- 3. 如何在bash中向外部程序發送外部命令?
- 4. 在std :: future上多次調用wait()並從多個線程安全地調用?
- 5. C#線程安全
- 6. C中的線程安全?
- 7. 在C#中命令行安全地轉義參數
- 8. 從子線程執行外部命令(並讀取其輸出)
- 9. iOS:正在調用主線程安全以外線程中的UIApplication方法嗎?
- 10. C++多線程安全局部變量?
- 11. 併發執行/重入/線程安全/?
- 12. 在C++中調用命令行程序
- 13. 使用外部API對象的java中的線程安全
- 14. 線程安全與地圖和併發哈希映射
- 15. 一個內部另一個併發收集:是線程安全
- 16. 線程安全的從EJB內部調用外部進程(並獲取其輸出流)的方式
- 17. 如何在C++的多線程中調用非線程安全的DLL?
- 18. 在C++中的線程安全隊列
- 19. 線程安全在C中增加#
- 20. 安全地取消線程
- 21. 安全地停止線程
- 22. 從Powershell插件調用外部命令
- 23. C#SetPropertyThreadSafe vs調用線程安全調用
- 24. 部分線程安全是否使Java類線程安全?
- 25. 可以安全地從Python中的線程調用多處理?
- 26. C++:在函數中安全地使用調用者的本地?
- 27. 使用BackgroundWorker在C#中併發線程
- 28. MS SQL中的UPDATE命令線程安全(跟蹤修訂版)
- 29. 從python(或bash)部分並行地運行外部命令
- 30. GAE命名空間是否可以安全地用於線程安全?
非常感謝所有的答案。事實上,popen解決了這個問題。有幾個鏈接把我扔了,但堆棧溢出總是有最好的信息。 – MeloMCR