2013-10-04 113 views
0

有什麼辦法可以強制線程擁有獨立的地址空間嗎?我想有很多線程使用局部變量運行循環 - 但它們似乎都共享相同的變量。PThreads地址空間

例如

for (i = args->start; i < args->end; i++) { 
     printf("%d\n", i); 
     if (quickFind(getReverse(array[i]), 0, size - 1)) { 
      printf("%s\n", array[i]); 
      //strcpy(array[i], ""); 
     } 
    } 

i似乎是跨線程共享。

+4

不使用全局變量或靜態變量,也不會傳遞線程之間的指針,所以不應該有太多的麻煩。唯一需要注意的是使用全局變量或靜態變量的庫函數..... – goji

+4

另外,您的示例並未真正顯示內存正在共享的位置,這些變量在哪裏聲明? – goji

+0

你的意思是像'fork()'? ...您仍然可以使用共享內存,信號燈,... – technosaurus

回答

0

線程共享其父進程的內存空間。它的特點。如果你不想發生這種情況,你可以使用fork()創建一個新的進程,它將擁有自己的地址空間。

如果您決定使用fork(),請記住,在成功創建子進程時,它將0返回到子進程並將子進程的PID返回給父進程。

0

簡短回答:是的,每個線程都有自己的變量副本i

龍回答

所有線程共享相同的地址空間和操作系統不提供任何保護,以防止一個線程訪問由另一個使用的內存。但是,可以對內存進行分區,以便僅由單個線程訪問,而不是由所有線程共享。

默認情況下,每個線程都會收到自己的堆棧。所以如果你在堆棧上分配一個變量,那麼它通常只能被一個線程訪問。請注意,可以將指針從一個線程傳遞到另一個線程的堆棧變量,但不建議這樣做,這可能是您看到的那類問題的根源。

線程接收自己的變量副本的另一種方法是使用線程本地存儲。這允許每個線程擁有自己的全局變量副本。

總之,雖然線程共享地址空間,但他們可以處理私有數據。但是您需要小心如何在線程之間共享數據並避免數據競爭。

0

只需將每個線程分別調用到函數中即可。函數的每個調用都會獲得所有局部變量的自己的實例。如果這不是真的,遞歸將不起作用。

0

如果你想變得非常懶惰,並且不做任何設計更改(不是真的推薦),你可以修改i的聲明爲__thread int i之類的東西,以便每個線程都有自己的那個變量實例。

如果您使用的是OpenMP而不是Posix線程,那麼在第一次使用i之前,您還可以說#pragma omp threadprivate(i)