Renaming a file within a directory should be a one-step (atomic) process (rename invokes
in reply to Synchronizing multiple processes retrieving files out of shared directory
a system an OS-level system library call - but as such, there might be site-specific issues you need to watch out for).
This approach relies on having some reliable constraint on the names of files being dropped in, so your processes can look for a file name that matches the constraint, and rename it to not match the constraint.
Still if you can rely on some renaming pattern that will surely not collide or be confused with incoming file names, then it should be possible to rule out race conditions. If two processes both spot the same new file, only one of them can succeed in renaming it (naturally, each process should use its own distinctive pattern for renaming files).
The process that fails when it tries to rename can just go back to looking for another new file.