If all of the DLLs are loaded into the same thread, you should be able to just call the DLL's exported functions as you would call any other ones. If each module is running in a different thread, you can use standard lock-based techniques with semaphores, mutexes, and critical sections, or atomic operations with memory barriers. If each module is running in it's own process, look up inter-process communication techniques such as named pipes or connecting via the network stack through localhost.
The fact that you load functions from a DLL doesn't really imply anything special. The only complication arises if you're going to try to catch exceptions through the DLL barrier, which can get complicated.