out of scope pointers in threads

U

uche

I am trying to send a pointer to the thread below; however, when the
thread gets executed, the pointer goes out of scope . How do I fix
it ?

int mywrite(char* id, int number_of_characters, char char_array)
{
HANDLE Producer;

DWORD ThId;

//global_char = char_array;

//create mutual exlusion for producer process to write into the
buffer

//create producer thread and start the function for inserting
characters
//mywriteTh is the entry point of the producer


ptr =new data;
ptr->character = char_array;
cout<<ptr->character<<endl;
ptr->id = id;
cout<<ptr->id<<endl;


Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
pointer to this thread

cout<<ptr->id<<endl;

return 0;
}

DWORD WINAPI mywriteTh(data ptr)
{
//global_char is available here

DWORD tId = GetCurrentThreadId();


data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
out of scope


}
 
U

uche

I am trying to send a pointer to the thread below; however, when the
thread gets executed, the pointer goes out of scope . How do I fix
it ?

int mywrite(char* id, int number_of_characters, char char_array)
{
HANDLE Producer;

DWORD ThId;

//global_char = char_array;

//create mutual exlusion for producer process to write into the
buffer

//create producer thread and start the function for inserting
characters
//mywriteTh is the entry point of the producer

ptr =new data;
ptr->character = char_array;
cout<<ptr->character<<endl;
ptr->id = id;
cout<<ptr->id<<endl;

Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
pointer to this thread

cout<<ptr->id<<endl;

return 0;

}

DWORD WINAPI mywriteTh(data ptr)
{
//global_char is available here

DWORD tId = GetCurrentThreadId();

data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
out of scope

}

please note: change data* to LPVOID ... HOWEVER, THIS DOESN'T SEEM TO
DO THE TRICK! I STILL GET A POINTER THAT IS OUT OF SCOPE!
 
J

James Kanze

uche said:
I am trying to send a pointer to the thread below; however,
when the thread gets executed, the pointer goes out of scope .
How do I fix it ?

What is "data"? Is it a data type, or a pointer to a data type?
You seem to use it both ways.
int mywrite(char* id, int number_of_characters, char char_array)
{
HANDLE Producer;
DWORD ThId;
//global_char = char_array;
//create mutual exlusion for producer process to write into the buffer
//create producer thread and start the function for inserting characters
//mywriteTh is the entry point of the producer
ptr =new data;

OK, we have 'data' as a data type, and 'ptr' is, I suppose a
data*.
ptr->character = char_array;

Again, what is char_array? Where does it come from?
cout<<ptr->character<<endl;
ptr->id = id;
cout<<ptr->id<<endl;
Producer = (HANDLE) CreateThread (NULL, 0, mywriteTh,
reinterpret_cast<data> (ptr) , 0, &ThId); // i want to send the
pointer to this thread

Anytime you need a reinterpret_cast for a function argument, you
should be asking yourself questions. If I understand the
interface description of CreateThread at MSDN (Microsoft seems
to go in a lot for obfuscated typenames), you don't need any
cast at all; just pass the pointer. (I'm guessing here that
LPVOID is a void*; where the L comes from, I don't know.)
cout<<ptr->id<<endl;
return 0;
}
DWORD WINAPI mywriteTh(data ptr)

And according to the documentation, this function must take a
void* (well, an LPVOID) as well, not a data. (The documentation
shows some __in as well. More obfuscation; I don't think it
means anything.)
{
//global_char is available here
DWORD tId = GetCurrentThreadId();
data *ptr_data = reinterpret_cast<data *>(ptr); // pointer is goes
out of scope

Again, a reinterpret_cast is a no-no. You need a static_cast of
the void* to the exact type of the pointer that was converted to
void*, above.

As for "going out of scope", of course the pointer goes out of
scope. But you're passing a copy of it to the thread, and the
memory it points to is still there.
 
M

Maic Schmidt

Your pointer seems to go "out of scope" because your procedure where you
declared the pointer ends,
and so its local variable stack is cleared.

Declare your data-pointer at class or global scope.

class SVDaemon
{
public:
void StartThread()
{
pointer = new MyData();
wndThread =
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)WindowThread,pointer,0,&threadId
);
}
private:
MyData* pointer;
DWORD threadId;
HANDLE wndThread;
static DWORD WindowThread(MyData* data);
};

Greetz
Maic
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top