我们知道,一个程序至少有一个进程,而一个进程至少包含一个线程,对于单进程单线程程序,要想完成多任务,一定是单步顺序执行的,即多个任务无法并发执行,一个任务的开始需要等待前一个任务的结束,对于并发性要求极高的服务器程序来说,单线程显然无法高效地处理任务。这时我们可以考虑采用多进程或多线程机制来封装程序。
关于如何取舍多线程或者多进程机制,需要考虑程序的特殊需求。多线程的优点在于它们共享进程堆上的数据,耗费系统资源少,一个线程可以创建和撤销另一个线程,但是因为线程之间没有独立的地址空间,访问堆数据需要互斥,这同样也是多线程的缺点,一个线程死掉就等于整个进程死掉。fork出来的子进程会拷贝父进程的内存映像,拥有独立的地址空间,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,资源利用率没有多线程的高。
对于多线程实现的程序,在访问、操作共享内存区域或者读写共有的文件描述符的前后记得加锁与解锁,用锁的互斥机制来保证共享资源在同一时间只被唯一一个线程所占有。
对于UNIX而言,fork创建进程已经被应用得相当广泛,机制成熟;pthread创建线程新生与上世纪90年代,还比较新,在某些版本中并不成熟,UNIX的有些版本甚至不支持多线程,比如SCO UNIX。在如今硬件发展速度快于软件发展速度的年代,为了程序的健壮性、稳定性,牺牲一些资源跟性能是值得的。但对于一些要求同时进行并且又要共享某些变量的并发操作,很有把握能处理好这些共享变量,采用线程又何乐而不为呢?
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。