当多个线程递增时共享变量的最小和最大可能值

时间:2010-11-21 03:01:09

标签: multithreading

我有一个全局共享变量,并且每个生成的5个线程都会更新5次。根据我的理解,增量操作由3条指令组成

load  reg, M
inc reg
store reg, M

所以我想问一下,在这种情况下,5个线程中任意交错的最大值和最小值是多少。

所以根据我的说法,最大值将是25(我100%确定它可以超过25)并且最小值是5.但是我对最小值不太确定。在一些任意交错中它可以小于5吗? 任何输入将不胜感激。

/* Global Variable */
int var = 0;

/* Thread  function */
void thread_func()
{
     for(int c = 0; c < 5; c++)
             var++;
}

3 个答案:

答案 0 :(得分:16)

鉴于你对增量的定义,我同意你的最大值为25。

但是,我认为在以下情况下min可以是2。我已经命名了5个线程A,B,C,D和E.

  1. A加载0
  2. C,D,E运行完成
  3. B经历了5次迭代中的4次。
  4. A递增0到1并存储结果(1)。
  5. B加载1
  6. A跑完成
  7. B增加1到2并存储2。

答案 1 :(得分:0)

如果我使用jtdubs给出的相同逻辑,则在下列情况下最小值应为1.

让我们使用与A,B,C,D和E相同的5个线程命名。

  1. A加载0
  2. B,C,D,E运行完成并增加到最大值20(4个线程各5个增量)。
  3. A递增0到1并存储结果1.

答案 2 :(得分:0)

我同意至少2(不是1)。

最小等于1的解决方案忽略了A在共享内存中存储1后仍然没有完成运行的事实。 没有其他线程留给&#34;干扰&#34;,线程A必须仍然运行以结果5结尾的剩余4次迭代。

2个解决方案启用的最小值是在剩余的两个线程A和B之间的最终游戏,在所有其他线程完成运行之后,导致最小可能的结果。 B&#34;废物&#34; 4次迭代只能再次加载1,增加它并在A运行完成后存储2。