Let me explain it.
Functions don't matter, the threads do. I mean, the same function can be called in different threads. What the function does is thread-safe in one case and not thread-safe in another.
Therefore, forger about functions and focus and threads and what resources are accessed. If more then one thread access the same resource, the access code should be locked out using some lock mechanism. In this case, the code itself can be the same called from different thread, of different; it does not matter; it's only important what is accessed by this code.
Locking is not the only thing. Calls can be serialized for example, by putting the delegates (code) or data in a queue. For example, see my short Tips/Trick article here:
Simple Blocking Queue for Thread Communication and Inter-thread Invocation[
^].
—SA