one difficult part in multithread programming is the fact that it is needed to deal with at least 2 different part of the hardware. for example, (1) reading disk files and (2) splitting tasks to multiple threads for CPUs. unfortunately the fact that the computer is doing that big job, by caching things, is counterproductive, as debugging and analyzing the code gets difficult. because, in case of disk files, data gets loaded much faster from the files that are already cached - automatically by the same consecutive operation.