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()的最大值和最小值是多少?

我认为最小值将为 0,但我不确定。最大值??199 ?

4

1 回答 1

1

在 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 个。

于 2012-05-02T03:18:22.840 回答