posix 多线程有感--线程
1.进程:资源分配单位(存储器,文件)和CPU调度(分配)单位。
线程:作为CPU调度单位,而进程只作为其资源分配单位。
(1)只拥有必不可少的资源,如:线程状态,寄存器上下文和栈。
(2)具有就绪,阻塞和执行三种基本状态。
2.进程和线程的比较:
(1)地址空间和其他资源(如打开文件):进程间相互独立,同一进程的各线程间共享。
(2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信。
(3)调度和切换:线程上下文切换比进程上下文切换快得多。
3.进程结束时不会等待其他线程结束,一旦进程结束就不关心线程在做什么。(pthread_exit,pthread_join)
4.一个没有被分离的线程终止时会保留其虚拟内存,包括他们的堆栈和其他系统资源。分离线程意味着通知系统不再需要此线程,允许系统将分配给它的资源回收。
5.如果需要获取线程的返回值,或者需要获知其何时结束,应该调用pthread_join函数。pthread_join函数将阻塞其调用者直到指定线程终止。
6.在当前线程从函数pthread_create中返回以及新线程被调度执行之间不存在同步关系。即新线程可能在当前线程从pthread_create返回之前就运行了。甚至在当前线程从pthread_create返回之前,新线程就可能已经运行完毕。
7.线程通常从启动函数中返回来终止自己。当调用pthread_exit退出线程或者调用pthread_cancel取消线程时,线程在调用完每个清理过程后也将进入终止态。如果线程已经被分离,则它立刻进入下一节——回收;否则,线程处于终止态,它还可以被其他的线程调用pthread_join连接。(这就像unix中的进程已经结束单还没有被一个wait调用回收一样。有时这种线程被称为“僵”线程,因为即使他们已经死了单还存在。僵线程可能会保留其运行时的大部分甚至所有资源。
8.如果有其他线程在等待连接进入终止态的线程,则该其他线程将被唤醒。它将从其pthread_join调用中返回相应的值。一旦pthread_join获得返回值,终止线程就被pthread_join函数分离,并且可能在pthread_join函数返回前被回收。
9.如果使用detachstate属性(设定PTHREAD_CREATE_DETACH)建立线程,或者调用pthread_detach分离线程,则当线程结束时将被立刻回收。如果终止线程没有被分离,则它将一直处于终止态直到被分离(通过pthread_detach)或者被连接(通过pthread_join)。(回收将释放所有线程终止时未释放的系统和进程资源,包括保存线程返回值的内存空间,堆栈,保存寄存器状态的内存空间等)。