Since each line is presumably not the same length, you cannot know its position in the file without reading all the previous lines first. So you need to read through the file while counting the linefeeds to know the byte offset of each line – if you decide to do this, do it before spawning the threads, otherwise they will duplicate this work.
Of course you could change the behaviour so that you divide the file by bytes instead of by lines, and seek to a given byte offset, and then skip from there to the next newline (and allow the thread with the preceeding byte range to exceed its range up to the end of line to make sure the split line is covered).
Also, you need to give each thread its own handle on the file, otherwise actions in one thread will affect the file position in other threads.