之前在项目中调试程序,因为项目代码比较复杂,把逻辑简单的抽取出来做个简短的代码如下
#include "stdafx.h"
#include<iostream>
#include <windows.h>
using namespace std;
int i, j;
DWORD WINAPI ThreadFunc1(LPVOID p);
DWORD WINAPI ThreadFunc2(LPVOID p);
int main()
{
i = 0;
j = 0;
CreateThread(NULL, 0, ThreadFunc1, NULL, 0, NULL);
CreateThread(NULL, 0, ThreadFunc2, NULL, 0, NULL);
system("pause");
return 0;
}
DWORD WINAPI ThreadFunc1(LPVOID p)
{
while (true)
{
i = i + 1000;
Sleep(300);
}
return 0;
}
DWORD WINAPI ThreadFunc2(LPVOID p)
{
while (true)
{
cout << "wait" << endl;
if (i - j>10000)
{
break;
}
}
cout << "todo1" << endl;
return 0;
}
在单线程中一般没问题,如果i-j>10000的话,循环就结束了,但是当时调试的过程发现i已经大于10000,j还是0,但是循环没有结束,后来定义了个在函数中定义个变量temp = i - j;发现实际上temp一直都是0, 所以循环没有结束,只是后来关了Visual Studio之后重新打开就再也没有重现出这个问题,但是还是觉得很奇怪,也怕偶尔不稳定。
也一度猜测是程序优化,后面把优化关了,变量加了volatile,但是后面去掉volatile也没再重现。