Multiple threads can open the same file, and read it. This is no problem, but threads must not share std::ifstream instances. Thus, you code can be executed by multiple threads.
If the files are dynamic, I guess that your application "consume" the files, nop ? If it is the case, you must synchronize your threads: one thread must list files in the directory, and allocate files to the other threads, that read files. If all threads read files without communication between them, they will read / consume multiple times a same file.
For the lock, I don't know: it depends on what you are doing... delete files ? write in these files ? rename them ? If you need some performance, one lock for each file is better.