A big confusion is sometimes made about threading if you focus on it as a simple function to call. The real scope of threading is to have parallel execution of tasks working concurrently.
You have to look at threading as starting a completely new program that share same process memory, so each objects and memory address are valid for all execution threads.
Using the correct point of view also organization of your design can be much more efficient.
For a general description look
here.
For a specific solution on parameters passing
see.
About returning a value read
this.
Btw looking correctly at threading make these elements secondary, with correct design they are not so usefull.