int total = 200; // total is a global variable
void process()
{
int local;
for( int i = 0 ; i< 100 ; i++ )
{
local = total;
local--;
total = local;
}
}
如果两个线程并行调用process()
,两个线程完成处理后total的最大值和最小值是多少?
我认为最小值将为 0,但我不确定。最大值?? 199?
最佳答案
在 C11 中,这被定义为“未定义的行为”,这意味着它对此不提供任何保证。
这或多或少也适用于 C99,尽管 C99 编写时并未考虑到并发性。每个线程都不知道另一个线程。
每个线程都会查看全局变量“total”100 次。
但是,每个线程都会获取自己的本地副本,递减该副本,然后将其写回到全局变量total。
但是,线程可能会获取全局变量“total”并保留临时副本,直到函数结束才将其写回。在这种情况下,下限可能是 100。
如果他们不保留本地副本,total 可能会下降不超过 1,因为它们都同步获取total,减少本地副本,然后写回。
如果没有某种方法来同步线程,以便一个线程“获取”总数,修改它,然后在另一个等待时“释放”它,则无法保证它会达到 0。
互斥体、信号量等是跨线程同步访问的方法。
伪代码:
process() {
for (loop) {
grab_mutex(total); // Will wait till total is free
total--;
release_mutex(total);
}
}
但是,下界肯定是0;减少的机会不超过 200 个。
关于c - Posix 线程 - 并行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10407198/