2015-10-30 188 views
-1

我想知道是否需要鎖定2線程的情況,一個讀取和另一個寫入同一個變量的情況。
例如:我們有2個主題:A & B,線程A在時間T讀取變量x,線程B在時間T寫入變量T. 我應該在這裏考慮某種類型的鎖嗎?線程讀取和寫入相同的變量

在我的情況下,我有主線程許多其他SubThreads。主線程保存List<myObj>,在開始任何SubThread之前,我創建myObj的實例,將其分配給List<myObj>並將myObj傳遞給子線程。
在確定的時刻,列表必須根據myObj中包含的值進行排序,並且完全可能發生主線程讀取的List元素同時被SubThread寫入。

請一些建議。

+0

請看下面:http://stackoverflow.com/questions/1668719/c-sharp-multi-threading-acquire-read-lock-necessary和http://www.albahari.com/threading/ – Lucian

+0

Downvoted因爲存在另一個具有相似但不相同問題的線程?怪異的...... – DientesDeCheto

回答

3

甚至不要考慮任何其它直到你有如何多線程的作品深刻而透徹的瞭解。強制性鏈接:至少是http://www.albahari.com/threading/。除非你有很好的理由,甚至沒有 - 尤其是像List那樣複雜的東西。

無論您何時訪問任何共享狀態,都要確保共享狀態的所有方式都是同步的。

可以使用無鎖同步,但這是一個相當先進的主題,並且容易出錯。如果你只更新一個原始值,Interlocked可能就足夠了。

但是,請不要忘記您正在使用的對象的合約 - List的排序只有在排序期間項目沒有更改時纔是安全的。因此,在開始排序之前,您需要確保noöne正在修改任何可能在排序正在進行時更改排序的內容。

真的需要那些子線程嗎?他們真的需要更新從一個單獨的線程列表(/項目)?也許可以將更改發佈到UI線程,同時避免那些多線程問題?

+0

,因爲它是關於客戶端線程在服務器 - 客戶端TCP通信,所以是的,他們是需要的。感謝您的回答,這很有幫助! – DientesDeCheto

+0

@DientesDeCheto實際上,TCP通信可以完全異步完成,不需要多線程。如果你只是讓所有的延續在UI線程上執行,你可以避免所有的麻煩,也不會在阻塞調用時浪費線程:) – Luaan

相關問題