为什么在相同的流中具有相同的延迟会影响结果?

时间:2019-04-09 16:41:42

标签: c++ windows winapi critical-section

我有2个未同步的线程来修改全局变量。每个线程有12次迭代。在执行修改命令之前,每个流都有1 ms的延迟。结果,全局变量等于112,这是合乎逻辑的,因为流同时修改了它,但是如果您消除了两个流中的延迟,则其中一个将领先于另一个流,以便另一个流接收到全局变量的当前值。启用延迟后,为什么会发生这种情况?

#include "stdafx.h" 
#include <windows.h> 
#include <iostream> 
#include <omp.h>
using namespace std;

int global = 100;
HANDLE ht1, ht2; 
DWORD WINAPI ThreadProc1(LPVOID lpParameter ) { 
    int i, j;   
    for (j=1; j <= 12; j++)    {
        i = global;      
        i++;     
        Sleep (1);  //Delay before modifying global variable
        global = i; 
        printf_s( "%4s %4d \n", " 1 th", i );    
    } 
    return 0;  
}
DWORD WINAPI ThreadProc2 (LPVOID lpParameter) { 
    int i, j; 
    for (j=1; j <= 12; j++)    {   
        i = global;      
        i++;     
        Sleep (1);  //Delay before modifying global variable     
        global = i;
        printf_s( "%4s %4d %4d \n", " 2 th", i, j );     
    } 
    return 0; 
} 
int _tmain(int argc, _TCHAR* argv[]) { 
    HANDLE msh[2]; 
    ht1 = CreateThread(NULL, 0, &ThreadProc1, NULL, 0, NULL); 
    ht2 = CreateThread(NULL, 0, &ThreadProc2, NULL, 0, NULL); 
    msh[0] = ht1; 
    msh[1] = ht2;
    WaitForMultipleObjects(2,msh,TRUE, INFINITE);
    return 0; 
} 

延迟结果 https://i.imgur.com/EMOQfTj.png

结果无延迟 https://i.imgur.com/Ilgz824.png

1 个答案:

答案 0 :(得分:2)

基于操作系统的线程调度,当添加延迟时,两个线程都执行i = global,两个线程中的全局值相同。因此,它仅增加了12。在没有延迟的情况下,代码:

i = global;      
i++;     
global = i;

未被中断,相当于此处的global++。结果就是100 + 12 * 2 = 124。