2010-05-03 37 views
2

似乎爲Signal類和插槽中的內容提供安全交叉線程信號的唯一實現方式是QT。 (也許我錯了?)。安全交叉線程信號/插槽C++

但我不能在我正在做的項目中使用QT。那麼我怎麼能提供來自不同線程的安全Slots調用(例如使用Boost :: signals2)呢?槽內的互斥是唯一的方法嗎?我認爲信號2保護自己,但不是在插槽內做什麼。

由於

+0

可能重複[如何在BOOST發送一個線程中的信號,並在另一個線程中執行相應的插槽?](http://stackoverflow.com/questions/5050588/how-in-boost-send-a-信號功能於一個線程和具有最對應的時隙執行的) – UmNyobe 2014-12-12 15:33:10

回答

0

這不是一個信號時隙實現,就是這樣,但有一個C++實現Twisted的延遲圖案的完成某項類似的目標到一個跨線程的信號槽機構。如果有人不來,併發布更好的解決方案,可能值得一看:http://sourceforge.net/projects/deferred/

1

您可以結合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 oo,因爲它的堆棧跟蹤和編譯時間很長( blog post)。