Posix线程 - 并行线程

时间:2012-05-02 03:07:37

标签: c pthreads posix

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?

1 个答案:

答案 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个。