[英]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.