Go4Expert

Go4Expert (http://www.go4expert.com/)
-   C++ (http://www.go4expert.com/forums/cpp/)
-   -   multi-thread programming in c++ (http://www.go4expert.com/forums/multi-thread-programming-cpp-t18555/)

kolonel 16Jul2009 03:31

multi-thread programming in c++
 
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);
}


hotnspicy 16Jul2009 06:40

Re: multi-thread programming in c++
 
clera glob_temp_var before calling it each time

xpi0t0s 16Jul2009 13:33

Re: multi-thread programming in c++
 
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.


All times are GMT +5.5. The time now is 08:15.