如何线程安全给变量归零
InterlockedIncrement 可以安全地加
InterlockedDecrement 可以安全地减
变量类型是 LONG
怎么安全地归零呢?我注意到了函数 InterlockedXor,可以用疑惑的办法清零
但是这个函数没有 LONG 类型的参数,而是ULONGLONG
[解决办法]
InterlockedExchange(a,b)能以原子操作的方式交换俩个参数a, b并返回a以前的值。
让其中一个为0就可以。
[解决办法]
不需要读值的纯赋值不是本来就原子操作么
[解决办法]
临界区或互斥量
[解决办法]
最安全的就是读写都加锁。
至少在刚开始编写程序的时候应该这么做。
等程序测试没问题,再逐步提高效率。有的地方可以不锁。
举例:判队列空是读操作,但有时也必须加锁。空的没问题,万一不空,只有1个任务,而2个线程都过了判断不空,去取数据,就会发生1个取到了,1个傻了,这时候再判空还不是多次一举。不如开始判断是否空的时候就加锁,能保证不空到时候一定能取到数据。
[解决办法]
可以在修改变量值的地方加 EnterCriticalSection / LeaveCriticalSection,当然这个操作没有Interlocked系列函数快