簡體   English   中英

安全跨線程信號/插槽C ++

[英]Safe Cross Thread Signals/Slot C++

似乎唯一為信號類和插槽中提供安全跨線程信號的實現是QT。 (也許我錯了?)。

但是我不能在我正在做的項目中使用QT。 那么,如何從其他線程提供安全的Slot調用(例如,使用Boost :: signals2)? 插槽內的互斥鎖是唯一的方法嗎? 我認為signal2可以自我保護,但不能保護插槽內部的工作。

謝謝

您可以結合使用boost :: bind和boost ASIO來創建跨線程調用。

# In Thread 2
boost::asio::io_service service;
boost::asio::io_service::work work (service); // so io service won't stop if there is no work 
service.run() # starting work thread

# In Thread 1
service.post (boost::bind (&YourClass::function, &yourClassInstance, parameter1, parameter2))

線程2將進入循環並執行您的綁定函數。 我認為您也可以在此循環中調用Boost :: Signals2調用。

但請注意:如果您執行跨線程信號傳輸,請確保在調用目標對象時該對象仍然存在。 您可以通過刪除目標析構函數中的所有連接(而不是其基類析構函數中的所有連接,也請參閱Signals-Trackable Class )來確保這一點。

我不太喜歡Boost :: Signals2,因為它的堆棧跟蹤和編譯時間非常長( 博客文章 )。

確切地說,這不是信號插槽的實現,但是Twisted的Deferred模式的C ++實現實現了與跨線程信號插槽機制相似的目標。 如果有人不願意提出更好的解決方案,那么可能值得一看: http : //sourceforge.net/projects/deferred/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM