秒杀多线程-原子操作


程序输出的结果好象并没什么问题。下面增加点用户来试试,现在模拟50个用户登录,为了便于观察结果,在程序中将50个用户登录过程重复20次,代码如下:

查看g_iLoginCount++;

第一条汇编就是将g_iLoginCount的值读取到寄存器eax中第二条汇编就是将寄存器eax的值与1相加,并将结果存入寄存器eax中第三条汇编就是将寄存器eax中的值写回内存中
这样由于线程执行的并发性,很可能线程A执行到第二句时,线程B开始执行,线程B将原来的值又写入寄存器eax中,这样线程A所主要计算的值就被线程B修改了。这样执行下来,结果是不可预知的——可能会出现50,可能小于50。
因此在多线程环境中对一个变量进行读写时,需要有一种方法能够保证对一个值的递增操作是原子操作——即不可打断性,一个线程在执行原子操作时,其它线程必须等待它完成之后才能开始执行该原子操作。Windows系统提供了一些以Interlocked开头的函数来完成这一任务(Interlocked系列函数)。
1.递增/减
2.指定增加或减少的值
3.赋值
修改代码:

只有一条汇编

因此,在多线程环境下,我们对变量的自增自减这些简单的语句也要慎重思考,防止多个线程导致的数据访问出错。更多介绍,请访问http://msdn.microsoft.com/zh-cn/library/aa909196.aspx
如果模拟100个用户登录会有意想不到的结果,可以试试,看一下运行结果
下一篇介绍一个经典的多线程问题
参考:https://blog.csdn.net/morewindows/article/details/7429155