Jump to content

  • Log In with Google      Sign In   
  • Create Account


Passing vector to a new thread


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 DarkRonin   Members   -  Reputation: 604

Like
0Likes
Like

Posted 15 May 2011 - 12:22 AM

Hi Guys,

I am trying to work out how I can access a vector of structs from a new thread.

The creation is of the vector is done like so;

void CoreNetwork::registerData(int nStructureType,void *pStructure,int nStructureSize)
{
 structure.nID=nStructureType;
 structure.pAddress=pStructure;
 structure.nSize=nStructureSize;
 DataHeader.push_back(structure);
}

But, I cant figure out how to iterate this data from another thread made with CreateThread().

Any help would be awesome. :cool:

Sponsor:

#2 DarkRonin   Members   -  Reputation: 604

Like
0Likes
Like

Posted 15 May 2011 - 01:54 AM

Or even how you can get a pointer to a vector?

#3 clb   Members   -  Reputation: 1780

Like
1Likes
Like

Posted 15 May 2011 - 02:34 AM

If you are referring to the Win32 API CreateThread() function, then you can use the fourth parameter lpParameter to pass in arbitrary data into the thread as a pointer to void. This is a far more preferrable way than using global variables to pass data to a new thread.

Since you can only pass in a pointer to a single object, you have to group the data to a single struct if you need to pass in multiple variables. What you can do is create something like
struct ThreadCreationParameters
{
   std::vector<int> myIntArray;
   int someOtherData;
   std::string someMoreData;
};

void StartThread()
{
   ThreadCreationParameters *params = new ThreadCreationParameters;
   // Populate contents of params here.
   CreateThread(..., params, ...);
}

DWORD WINAPI MyThreadMain(LPVOID param)
{
   ThreadCreationParameters *params = reinterpret_cast<ThreadCreationParameters *>(param);
   // Now can access parameters with params->xxx

   // Remember to delete params after we are done.
   delete params;
}

Note that it is important that you dynamically allocate the ThreadCreationParameters structure instead of placing it into the stack, since after exiting StartThread(), the stack would be cleared, and MyThreadMain would be accessing freed memory.

Also, remember that any variables you pass in ThreadCreationParameters by pointer or by reference need to be appropriately guarded with a synchronization primitive if both threads will be accessing the data.
Me+PC=clb.demon.fi | C++ Math and Geometry library: MathGeoLib, test it live! | C++ Game Networking: kNet | 2D Bin Packing: RectangleBinPack | Use gcc/clang/emcc from VS: vs-tool | Resume+Portfolio | gfxapi, test it live!

#4 DarkRonin   Members   -  Reputation: 604

Like
0Likes
Like

Posted 15 May 2011 - 04:59 AM

Awesome, I have been playing with your example and I get what is happening here :cool:

I'll apply it to my app and see how I go.

Thanks again for your help ;)



[edit]
I have just translated this to suit my app and it looks like it is exactly what I need. Thanks again, bro! :cool:




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS