2012-05-02 95 views
0
int total = 200; // total is a global variable 

void process() 
{ 
    int local; 
    for(int i = 0 ; i< 100 ; i++) 
    { 
     local = total; 
     local--; 
     total = local; 
    } 
} 

如果2個線程調用並聯process()線程,會是怎樣的最大&最小值兩個線程後完成處理?Posix線程 - 並行

我認爲最小值將爲0,但我不知道。最大值? 199?

+0

這是一個功課題嗎?如果是這樣,你應該這樣標記它。 – Amber

+0

在C++ 11中,由於'total'上的競爭條件,這是未定義的行爲。雖然我不確定C11。 – Mysticial

+0

@Mysticial'未定義的行爲'並不總是一個答案:-P我認爲OP正在尋找一個關於低層可能發生的事情的想法。如果您檢查程序集,它會將總數讀入寄存器,然後寫回。 –

回答

1

在C11中,這被定義爲「未定義的行爲」,這意味着它不提供任何保證。

這或多或少都屬於C99,儘管C99並沒有考慮併發性。每個線程都不知道其他線程。

每個線程都會查看全局變量'total'100次。

但是,每個線程都獲得自己的本地副本,將其遞減並將其寫回全局變量total。

但是,線程可能會採用全局變量'total'並保留臨時副本,而不寫回,直到函數結束。在這種情況下,下限可能是100.

如果他們不保留本地副本,總數可能會下降不超過1,因爲他們都同步獲取總數,遞減本地副本並回寫。

沒有同步線程的一些方式,讓一個「抓」總,修改它,然後「釋放」它,而其他的等待,沒有機制保障,它會達到0

互斥,信號等等是跨線程同步訪問的方式。

僞代碼:

process() { 
    for (loop) { 
    grab_mutex(total); // Will wait till total is free 
    total--; 
    release_mutex(total); 
    } 
} 

然而,下界絕對是0;減少的機會不超過200個。

+0

我們還沒有學習關於使用信號量的線程同步。問題是「在兩個線程執行完之後,最大可能值和總計的最小可能值是多少?」 –

+0

我知道下限爲0,但是如何找出總線可能具有的最高可能值執行? (線程並行執行)。我認爲我的教授並不期望總保證達到最大值或最小值,而只是想知道可能的值。 –

+0

@DaffyDaffy它不能低於0,因爲總數減少的概率不會超過200。出於同樣的原因,它不能超過200:因爲只有減量完成,它需要下溢超過200.儘管確切的上限很難確定,因爲它是依賴於環境的,但是讓我們說200因爲行爲是不明確的 –