2017-08-23 34 views
0

如果我有兩個線程A和B在一個進程和線程A創建了一個定時器,由於定時器回調可以中斷任一線程,是否意味着訪問共享對象(線程和定時器回調之間)需要同步? 它也說定時器回調和應用程序線程之間的同步是不安全的,比如線程A鎖定了一個互斥mA,然後它被定時器回調中斷,在定時器回調中它也試圖鎖定mA,現在發生死鎖。 我在上述說法中是否正確?如果它是真的,定時器回調有很多限制,以避免同步問題。Linux環境中,定時器的回調和應用程序線程之間的同步

回答

0

相關的問題,如您帶來的信號最簡單的方法,是不是異步處理的信號。有幾種方法可以做到這一點。

首先,如果信號到達一個進程組,這是很好的做法,只有一個線程不會阻止信號。

接下來,精確的解決方案取決於你的程序的主循環是怎樣的。最有可能的是,這是一個圍繞select/epoll的循環。如果是這樣,請查看pselectepoll_pwait,並確保你明白他們的意思。用這種方式處理你的信號意味着你的信號處理程序與你的實際程序同步運行,幾乎消除了所有的限制。

一個更好的解決方案(但只有一個是Linux)是不用信號處理程序處理信號,而是用signalfd將它變成文件描述符。

最後,但絕非最不重要的,如果你想要的是處理文件描述符+基於定時器動作,有包裝,對於你在以業績爲導向的實施庫。您還可以免費獲得平臺獨立性。

兩個這樣的庫libeventlibev

+0

感謝您提供豐富的建議! 我們終於使用的忙檢查機制: 主循環使用消息隊列以接收傳入消息,每個環的第一與IPC_NOWAIT檢查消息隊列和處理它,如果有的話,然後,它會檢查定時器列表,以查看是否任何定時器到達並調用它。 使用pselect確實是一個完美的解決方案,但我們的情況是該庫需要在vxworks中使用。 是否知道vxworks中是否有類似的解決方案 - 提供一種很好的定時器解決方案,以同步方式運行回調? –

+0

你把你的問題標爲'linux',所以我給你一個Linux答案。 'pselect'是一個Posix標準函數,但vxWorks不完全是Posix兼容的,所以我不知道你的解決方案在那裏。我建議再次詢問並標註爲vxWorks。 –

相關問題