Multi-threaded applications create significant issues for applications developers. When more than one thread may access resources, such as the disk or areas of memory, there is a risk of data corruption.
Also, in a modern operating system, a programmer cannot assume that their program will run in the order in which the code was written. It is possible for more than one function to run at the same time, or for one function to be stopped and restarted before it completes its first complete cycle.