我有一個簡單的問題,我相信,據我所知,一個多執行緒程式,他們在所有執行緒之間共享行程的記憶體空間,這包括,堆疊,全域記憶體區,檔案描述符等,我想知道為什么在第一個例子中,有一個一致性問題,因為理論上所有執行緒都共享堆疊,在第二個例子中,出現了競賽問題。
#include <stdio.h>/span>
#include <pthread.h>
void *thr(void *arg)
{
for(int i = 0; i < 50; i )
printf("Thread = %zu Value= %d
", pthread_self(), i)。
return NULL。
}
int main(void)。
{
pthread_t threads[2] 。
for(int i = 0; i < 2; i )
pthread_create(&threads[i], NULL, thr, NULL)。
for(int i = 0; i < 2; i )
pthread_join(threads[i], NULL)。
return 0;
第二個程式有運行問題
3個有競賽問題的例子,在這種情況下,變數是在主執行緒中創建的,并作為引數傳遞給函式,也就是說,唯一的共享堆疊是來自主執行緒?
#include <stdio.h>
#include <pthread.h>
void *thr(void *arg)
{
int *ptr = (int *)arg。
for(; *ptr < 50; (*ptr) )
printf("Thread = %zu Value= %d
"/span>, pthread_self(), *ptr)。
return NULL。
}
int main(void)。
{
int i = 0;
pthread_t threads[2] 。
for(int i = 0; i < 2; i )
pthread_create(&threads[i], NULL, thr, &i)。
for(int i = 0; i < 2; i )
pthread_join(threads[i], NULL)。
return 0;
uj5u.com熱心網友回復:
在所有執行緒之間共享行程的記憶體空間,這包括堆疊
好吧,是也不是。
共享一個
記憶體地址空間和一個特定的記憶體區域之間是有區別的。雖然所有執行緒確實共享一個地址空間,但每個執行緒都有自己的堆疊(分配記憶體)。
共享地址空間意味著一個給定的虛擬地址(指標值)在所有執行緒中指的是相同的物理記憶體。
但專用堆疊意味著每個執行緒的堆疊指標都從該地址空間的不同位置開始,這樣就不會相互沖突。
uj5u.com熱心網友回復:
一個行程中的每個執行緒通常都有自己的堆疊指標(意味著它有自己的堆疊)。
這意味著,雖然他們共享虛擬地址空間,使他們能夠訪問其他執行緒的變數甚至堆疊,但他們通常在這個共享的虛擬記憶體空間的不同地方擁有自己的堆疊,而不是重疊的。
當內核安排一個執行緒時,它將執行緒的暫存器安裝在它要使用的內核或cpu中(這包括堆疊指標,每個執行緒都有一個堆疊值)。事實上,內核為每個執行緒維護一個用戶模式堆疊和一個內核堆疊(最后允許同一行程的兩個不同執行緒在同一時間執行系統呼叫--相同或不同--,如果它們必須共享一個堆疊,這就不可能了)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308329.html
標籤:
