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?
答案 0 :(得分:1)
在C11中,这被定义为“未定义的行为”,这意味着它不保证它。
这或多或少也适用于C99,尽管C99并未考虑并发性。每个线程都不知道另一个。
每个线程将100次查看全局变量'total'。
但是,每个线程都会获得自己的本地副本,将其减少并将其写回全局变量total。
但是,线程可以采用全局变量'total'并保留临时副本,而不会将其写回,直到函数结束。在这种情况下,下限可能是100。
如果他们没有保留本地副本,则总数可能会下降不超过1,因为他们同时获取总数,减少本地副本,然后回写。
如果没有某种方式同步线程,那么一个“抓取”总数,修改它,然后“释放”它而另一个等待,没有保证它将达到0。
互斥锁,信号量等是跨线程同步访问的方法。
的伪代码:
process() {
for (loop) {
grab_mutex(total); // Will wait till total is free
total--;
release_mutex(total);
}
}
但是,下限绝对是0;减少的机会不超过200个。