簡體   English   中英

Posix線程-並行線程

[英]Posix Threads - Threads in Parallel

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()平行,這將是的最大和最小值之后兩個線程完成處理?

我認為最小值將為0,但我不確定。 最大值?? 199嗎?

在C11中,這被定義為“未定義的行為”,這意味着它不提供任何保證。

盡管在編寫C99時並沒有考慮到並發性,但C99也是如此。 每個線程都不知道對方。

每個線程將查看全局變量“總計” 100次。

但是,每個線程都有自己的本地副本,將其遞減,然后將其寫回到全局變量total中。

但是,線程可能會使用全局變量“ total”並保留一個臨時副本,直到函數結束之前才將其寫回。 在這種情況下,下限可能是100。

如果他們不保留本地副本,則總數可能會減少不超過1,因為它們都同步獲取總數,減少其本地副本並寫回。

如果沒有某種同步線程的方法,那么一個“抓取”總數將被修改,然后“釋放”,而另一個則將等待,因此沒有保證它將達到0。

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

偽代碼:

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

但是,下界一定是0; 遞減的機會不超過200。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM