Threads are much more efficient. Fork() duplicate the entire process, thus needing A LOT more resources. It is also harder to have 2+ forks() communicate (PIPE or socket or shared memory) vs direct access to all data structures (this of course can lead to other problems though.)