本篇博文仅会列出本章节中所使用的函数。
select()
1 |
|
当select触发后,对应的fd_set中的内容会被改变。
线程
创建线程
1 |
|
pthread_create函数创建一个新的线程,并带着一个输入变量arg,在新线程的上下文中运行线程例程f。能用attr参数来改变新创建线程的默认属性。
获取线程ID
1 |
|
终止线程
一个线程是通过下列方式之一来终止的:
- 当顶层的线程例程返回时,线程会隐式地终止。
- 通过调用pthread_exit函数,线程会显式地终止。如果主线程调用pthread_exit,它会等待所有其他对等线程终止,然后再终止主线程和整个进程。
1 |
|
- 某个对等线程调用Linux的eixt函数,该函数终止进程以及所有与该进程相关的线程。
- 另一个对等线程通过以当前线程ID作为参数调用pthread_cancel函数来终止当前线程。
1
2
int pthread_cancel(pthread_t tid); // 若成功则返回0,若出错则为非零。
回收已终止线程的资源
线程通过调用pthread_join函数等待其他线程终止。
1 |
|
pthread_join函数会阻塞,直到线程tid终止,将线程例程返回的通用(void*)指针赋值为thread_return指向的位置,然后回收已终止线程占用的所有内存资源。
分离线程
在任何一个时间点上,线程是**可结合的(joinable)或者是分离的(detached)**。一个可结合的线程能够被其他线程收回和杀死。在被其他线程回收之前,它的内存资源(例如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的。它的内存资源在它终止时由系统自动释放。
默认情况下,线程被创建成可结合的。为了避免内存泄漏,每个可结合线程都应该要么被其他线程显式地收回,要么通过调用pthread_detach函数被分离。
1 |
|
pthtread_detach函数分离可结合线程tid。线程能够通过以pthread_self()为参数的pthread_detach调用来分离自己。[博主注: 其实意思就是你可以在线程中使用pthread_detach(pthread_self())来分离调用这段代码的线程]
初始化线程
1 |
|
once_control变量是一个全局或者静态变量,总是被初始化为PTHREAD_ONCE_INIT。当你第一次用参数once_control调用pthread_once时,它调用init_routine,这是一个没有输入参数,也不返回什么的函数。接下来的以once_control为参数的pthread_once调用不做任何事情。[博主注: 其实它的功能就是调用一个无返回值且无参数的函数一次,以后再执行这个函数,如果还是同一个once_control参数,便不再调用了]
信号量
1 |
|