多线程调试碰到的奇怪问题
malong 发布于 2022-09-18
之前在项目中调试程序,因为项目代码比较复杂,把逻辑简单的抽取出来做个简短的代码如下
#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也没再重现。
关注 私信
文章
35
关注
0
粉丝
0