Tie::File is a bit different from a standard library function. The reason strtok isn't thread-safe is that it stores data in an internal static variable that is shared by the whole process, and isn't thread-local. The usual way to make something like this thread safe is to either eliminate the buffer or make the user of the function pass in the buffer to be used, allowing them to make sure its thread-local. This means that the function itself doesn't contain any thread-handling code, and places this burden on the user.
The difference between Tie::File and a library function is clear. Tie::File explicitly stores information between calls. Once you know that Tie::File stores data and doesn't use locking, it should be immediately clear that using it without your own locking on the variable is not thread-safe.
If you're using threads it should be the responsibility of the user to handle locking on shared variables as this allows consistency across their application and they can handle the hard bits like dead-lock resolution.
integral, resident of freenode's #perl