2013-11-28 56 views
0

這是一個普遍的事實,pthread_mutex_lock()應該總是應用於線程函數中使用的全局變量和靜態變量。線程函數內的局部變量如何?對於具有局部變量的線程函數,pthread_mutex_lock是否必需?

什麼是用例,其中線程函數中的局部變量應該被鎖定,還是應該始終被鎖定?

例子:

int func(void) 
{ 
    int var; 
    var++; // What are the usecases in which this should be locked? 

} 

pthread_create(&threadid1, NULL, func, NULL); 
pthread_create(&threadid2, NULL, func, NULL); 
+0

據我所知,你可以在圍牆,互斥和/或原子上構建多線程應用程序,所以你的「通用事實」更像是一個觀點。 – user2485710

+0

對於在多個線程中使用的變量,您應該使用互斥鎖。如果你從兩個線程訪問你的本地變量(使用mutex_lock())。 Othrewise no。 –

+0

應該可以從多個線程訪問更正確的線程化基元。你如何做到這一點取決於你。全球和靜態範圍界定只是可以實現的兩種方式。相反,鎖定CAN僅在鎖的主題可被另一個線程訪問的情況下有用。然而,在我看來,雖然可以在不使用全局/靜態範圍的情況下共享變量,但由於最少突然出現的原則,這是不可取的。 – Aron

回答

1

沒有,堆棧變量可以從你的線程安全地訪問,即使您使用相同的功能來啓動多個線程。

每個線程都有自己的堆棧,所以每次啓動時都會有一個單獨的'int var'實例。

通常的限制當然適用。如果你在多線程中共享'var',你仍然需要保護它,但是沒有任何隱式或自動共享堆棧變量。

+0

如何調用func()中的pthread_create並將var作爲線程數據傳遞? – kingsmasher1

+0

因此,考慮到上述情況,我們不能制定一個普遍的規則,即不應該保護局部變量,是的,我想你指出 - 「如果你以某種方式共享'var'跨多線程,你仍然需要保護it' – kingsmasher1

相關問題