我一直在環顧四周,試圖找到一種方法在我的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. 如何在bash中向外部程序發送外部命令?
- 2. 在std :: future上多次調用wait()並從多個線程安全地調用?
- 3. 在C#中命令行安全地轉義參數
- 4. C#線程安全
- 5. C中的線程安全?
- 6. 併發執行/重入/線程安全/?
- 7. C++多線程安全局部變量?
- 8. 在C++中調用命令行程序
- 9. 使用外部API對象的java中的線程安全
- 10. 線程安全與地圖和併發哈希映射
- 11. 線程安全在C中增加#
- 12. 部分線程安全是否使Java類線程安全?
- 13. 可以安全地從Python中的線程調用多處理?
- 14. MS SQL中的UPDATE命令線程安全(跟蹤修訂版)
- 15. 使用BackgroundWorker在C#中併發線程
- 16. 線程安全應用程序中的線程安全
- 17. 退出時Bash調用外部命令並返回控制
- 18. 在C中爲OpenMP使線程安全函數安全
- 19. C++線程安全摘要
- 20. C#:線程安全事件
- 21. C++線程安全整數
- 22. C++線程安全映射
- 23. C++線程安全和notify_all()
- 24. 我無法在多個線程上調用SQL命令C#
- 25. 在Visual C++中查找調用函數地址(安全地)
- 26. 線程安全地使用System.Configuration
- 27. 安全地喚醒Ruby中的線程
- 28. imagecreatefrompng安全地獲取外部圖像?
- 29. 在VIM中使用外部命令鏈內置命令
- 30. 線程安全調用WinForm的控制
非常感謝所有的答案。事實上,popen解決了這個問題。有幾個鏈接把我扔了,但堆棧溢出總是有最好的信息。 – MeloMCR