multi-thread programming in c++

kolonel's Avatar, Join Date: Jul 2009
Newbie Member
Hi,
I'm new in c++ thread programming, so I made a short program to understand how threads work in c++. However, the result is not what I expected, could anybody please take a look at this code and see if I did something wrong:

There is a glob_temp_var whose value is updated at each thread calling and it is printed out at two points: point 1 and point 2, points before and after updating in thread function. Although the glob_temp_var is changing inside the thread function, in point 2 the not-updated value of that, i.e. the value before going into the thread function, is printed out!
I think it is not correct, does anybody have any explanation or suggestion?
Thanks.

Code:
#include <iostream>
#include <windows.h>
#include <process.h>
#include <time.h>

HANDLE hEvent[MAX_CPU_COUNT];
HANDLE StartEvent[MAX_CPU_COUNT];

int glob_temp_var=0;

static void Thread1 (LPVOID lpParam){
    while (true){
        WaitForSingleObject(StartEvent[0], INFINITE);
        glob_temp_var++;
        ResetEvent(StartEvent[0]);
        SetEvent(hEvent[0]);
    }
}

int
main(int argc, char** argv)
{
    for (int i=0; i<MAX_CPU_COUNT; i++){
        hEvent[i] = CreateEvent( NULL, TRUE, TRUE, NULL );
        StartEvent[i] = CreateEvent( NULL, TRUE, TRUE, NULL );
    }

    _beginthread( Thread1, 0, NULL );

    Sleep(1000);

    for (int t=0;t<duration;t++){      
        std::cout<<glob_temp_var;      //////////////// point 1

        for (int j=0; j<MAX_CPU_COUNT; j++)        
            SetEvent(StartEvent[j]);
        
        WaitForSingleObject(hEvent[0], INFINITE );
        
        for (int j=0; j<MAX_GPU_COUNT; j++)    
            ResetEvent(hEvent[j]);

        std::cout<<glob_temp_var;      //////////////// point 2
    }

    for (int j=0; j<MAX_CPU_COUNT; j++){
        ResetEvent(StartEvent[j]);
        ResetEvent(hEvent[j]);
    }
 CUT_EXIT(argc, argv);
}

Last edited by shabbir; 16Jul2009 at 08:51.. Reason: Code blocks
0
hotnspicy's Avatar
Banned
clera glob_temp_var before calling it each time
0
xpi0t0s's Avatar, Join Date: Aug 2004
Mentor
Just looking at the code doesn't give any clue about your intent; could you describe step by step what you think the program does and why?

Do you have optimisations switched off? It's possible the compiler might think glob_temp_var hasn't changed and therefore print out the same value it printed before, rather than generating code to go back to memory and actually take a look. You may need to define glob_temp_var volatile.