volatile long m_l = 0; if (m_l == 100) { // 程序执行到这里, 判断已经完成 // 如果这时其它地方调用 Interlocked* 系列函数改变 m_l 的值 // 那我这个判断是不是多余的? // .... }
[quote=引用 6 楼 oyljerry 的回复:] 当然需要所有的线程都用interlocked去操作这个变量,才会各个线程之间会有锁定的动作,这样就能保证多个线程都修改这个变量的时候是原子操作,比如两个都是+1,那么最终结果肯定是+2,而不是最终可能出现+1 如果一个线程没有用interlocked去读取变量,那么他就可能读取到修改前的变量,或者修改后的变量,都有可能,未知
[quote=引用 2 楼 danscort2000 的回复:] Interlocked* 系列函数是一个原子操作, 也就是系统保证你在执行的时候不会者被其他线程切入等操作 例如 当你执行 i=i+1的时候[i初始化为0],代码执行过程中的i,是可以在执行期间被其他线程抢先切入修改的[例如被其他线程修改为1],可能出现值出现混乱引发程序崩溃 但是如果你用Interlocked*系列函数,所有针对i的操作都使用Interlocked*,那么即使同时有100个线程在执行不同的针对i的加或者减,系统都会保证是一个顺序的原子操作 不会出现几个线程同时修改i值的情况发生
Interlocked 方便同步单个变量。 具体看 win核心编程
Interlocked* 系列函数是一个原子操作, 也就是系统保证你在执行的时候不会者被其他线程切入等操作 例如 当你执行 i=i+1的时候[i初始化为0],代码执行过程中的i,是可以在执行期间被其他线程抢先切入修改的[例如被其他线程修改为1],可能出现值出现混乱引发程序崩溃 但是如果你用Interlocked*系列函数,所有针对i的操作都使用Interlocked*,那么即使同时有100个线程在执行不同的针对i的加或者减,系统都会保证是一个顺序的原子操作 不会出现几个线程同时修改i值的情况发生
当然需要所有的线程都用interlocked去操作这个变量,才会各个线程之间会有锁定的动作,这样就能保证多个线程都修改这个变量的时候是原子操作,比如两个都是+1,那么最终结果肯定是+2,而不是最终可能出现+1 如果一个线程没有用interlocked去读取变量,那么他就可能读取到修改前的变量,或者修改后的变量,都有可能,未知
interlocked系列函数里有测试数值的函数,返回值就是你调用完成后的瞬间值,但是 interlocked大部分函数只有在已经淘汰的Intel Itanium 处理器平台有效,X86/X64平台能适用的很少
15,471
社区成员
49,182
社区内容
加载中
试试用AI创作助手写篇文章吧