2012-02-06 32 views
1

這聽起來可能是一個基本的問題,但我從來沒有正式的答案(如果有的話)。根據以下方案同步兩個線程的最佳方法?

什麼是最好的方式(有效的方法)去了解同步如下:

  • 主題1: 而(1) 讀(shared_data)

  • 線程2: 而(1) 鎖(shared_mutex) 寫(shared_data) 解鎖(shared_mutex)

如果線程1只是讀取數據,是否需要鎖定互斥鎖?或者只是寫入線程需要這樣做?

感謝名單

+0

什麼具體類型是'shared_data'? – ildjarn 2012-02-06 23:17:47

回答

2

簡答訪問共享數據的所有線程都需要抓住保護數據的鎖。

長答案如果讀者沒有鎖定數據以讀取它,那麼如果寫入線程在讀取數據時正在寫入數據,線程可能會讀取損壞的數據。而在現代多核/多處理器領域,不要指望任何數據類型都是原子級安全的讀取或寫入。

編輯(通過沙赫巴茲):其實,在你的榜樣,Thread 2總是成功鎖定該互斥鎖,所以沒有同步發生的。在您簡單的情況下,答案也很簡單:

Thread 1: 
    while(1) 
     lock(shared_mutex) 
     read(shared_data) 
     unlock(shared_mutex) 

Thread 2: 
    while(1) 
     lock(shared_mutex) 
     write(shared_data) 
     unlock(shared_mutex) 
+0

@Shahbaz Thanx的答案。 – Radads 2012-02-13 16:38:29

+0

@Shahbaz:感謝您的編輯。 :) – grieve 2012-10-09 13:34:01

0

如果寫作過程中讀取不是一個問題,那麼你就不需要讀鎖,但你並不需要寫鎖。所以你需要在閱讀過程中鎖定。

0

如果你只有2個線程,那麼互斥量沒有任何用處。如果T2在T1正在讀取時更改shared_data可以,則取出該互斥鎖。如果(而且這很可能)是不正確的(因爲T1在單次讀取後可以看到一些舊數據和一些新數據),那麼T1需要用互斥鎖調用來保護讀取。

相關問題