2010-05-18 144 views
2

這是一個非常基本的問題,我想它是,但我找不到任何明確的答案。是SynchronizationContext.Post()線程安全嗎?SynchronizationContext.Post()線程安全嗎?

我有一個成員變量,它包含主線程的上下文,而_context.Post()被從多個線程中調用。我想Post()可以在對象上同時調用。我是否應該像

lock (_contextLock) _context.Post(myDelegate, myEventArgs); 

或者那是不必要的?

編輯:「任何實例成員不能保證線程安全
MSDN指出,如果我把我的lock(),然後呢?

回答

3

嚴格執行MSDN文檔,然後否,SynchronizationContext.Post方法不是線程安全的。因此,除非文檔中有錯誤,否則您將需要同步對該方法的訪問。我很難相信它本身不是線程安全的,但是在處理線程同步問題時,您不能依靠假設。直到微軟糾正文檔或真正使其線程安全之前,真的沒有辦法解決這個問題。

+0

看着反彙編的代碼,這個方法只是調用ThreadPool.QueueUserWorkItem,根據msdn,IS線程安全。 – 2010-05-18 19:58:45

+1

@菲爾:這並不奇怪。不幸的是,微軟已經有效地保留了在未來版本或者服務包中以一種可以使其當前的線程安全行爲無效的方式來改變實現的權利。我的猜測是他們真的打算讓這個類擁有線程安全的實例方法,並且他們只是搞砸了文檔。但是,這又是一個假設。 – 2010-05-18 20:07:28

+0

考慮到它的用法,將它變成無法線程安全的將是愚蠢的! – RichardOD 2010-06-13 11:35:59

1

SynchronizationContext.Post是線程安全的。文件忽略了這個事實。

我基於微軟的AsyncOperationAsyncOperationManager實現這個斷言,假設SynchronizationContext.Post是線程安全的(包括任何派生實現)。