Q: How do I share a random variable/container between multiple threads?
A: Don't do that. It's problematic.
Q: But, I lock and unlock (or sync) every access to that var / list, why is it still problematic?
A: Lock and unlock (or critical section, mutexes, etc) are the most invasive and expensive functions you can execute. And they're mutually exclusive: the second lock on the same object will deadlock your app. Try not to use them.
Q: But, I have to tell the main app from multiple threads what to display, and when they're finished!
A: Yes, that's hard. Think really hard about that.
Q: But, I HAVE to communicate!
A: Have the main app create a thread-safe queue, pass the address to the threads and use that. It's your only safe bet.
Q: I really need multi-directional communications...
A: Use sockets. Quite complex if you need a manager (and you probably do), but it's the only safe way. And hey, it works on every platform!
Edit: I should make a threading class and document. And probably some other ones as well.