I don't know if this is as simple as it sounds to me, but just iterate through the Diff pairs, and the position of the pair that has '\n' incremented by 2 will give the line on which the cursor should be, right?
In the above example, \n is present in the 0th pair of the diff list. So, the cursor should be on the second line. (0 + 2 = 2).
thread is subset of process - not sure what is "set" and "subset" here. A process can be considered as a single thread. A process with more than one threads is possible in which more than one threads shares address space (virtual memory address space) of a process and there can be more than one thread in execution at a time if hardware has more than one cores.
threads don't share signal masks - at least on Linux. sigprocmask behavior is undefined for multi-threaded process. check pthread_sigmask. So threads do not share signal handling per say - they do share code segment of a process and so functions or handlers are shared.
Threads have 'almost no overhead' - not sure what do you mean by that. Threads have separate stacks, and register contexts. Also using threads require use of locks or mutices which is "overhead" IMO.
File system context - not sure what do you mean by file system context but file table is shared even among multiple processes, that is how files are shared. So one file can be open for reading in one process, for writing in second process.
Processes and threads both can be made either dependent or independent