前言:什么是进程?进程就是运行中的程序,操作系统为了方便管理运行中的程序,分别给每个程序注册一个进程,每个进程都有一个独有的进程id(进程号)
(1)一个进程下可以存在多个线程,线程与线程之间是并发执行的,每个线程也都有一个独特的线程ID
线程 | 进程 | |
标识符类型 | pthread_t | pid_t |
获取id | pthread_self() | getpid() |
创建 | pthread_create() | fork() |
(2)在Linux中线程id(pthread_t)和进程id(pid_t)都是无符号整数,且上述函数需要包含头文件#include
(3)在mian函数被执行即产生一个主线程,其他线程通过pthread_create()产生,若主线程return(相当于进程结束),则其余线程都会跟着结束
(4)线程的四种状态,就绪,运行,阻塞,终止
1.pthread_create()
(1)第一个参数thread用于存储创建出来的线程的id,第二个参数暂时也不知道是什么一般填NULL(空指针),第三个函数填回调函数的函数名(也就是地址),最后一个函数填回调函数的参数,该函数成功时返回0,创建线程失败返回错误码
(2)什么是回调函数?
回调函数就是线程创建出来要执行的函数,如:
这是回调函数的格式,其中的函数名和函数内的内容是可以修改的
void *hanshuming(void *canshu)
{
...
return (void *)0;
}
2.向mian函数传递参数
其实int main()可以写成int main(int argc,char *argv[]),其中的argc为参数的个数,这个会自动统计,后面的指针数组是我们参数的存放地址
上图中我们调用了main函数,且./exit作为第一个参数传递到主函数中,后面的1 2 3 以字符串的形式同样作为主函数的参数
3.pthread_exit()
上述我们提到若主线程return,代表这进程的结束,其余线程也会结束,但是如果用pthread_exit()代替return则其他子线程还会继续执行,但是如果无论我们在任何线程中调用exit()函数进程都会跟着结束
4.线程的分离
(3)分离一个正在运行的线程,仅仅是通知当前操作系统该线程结束时,其所属资源可以被回收,终止被分离的线程时,会释放其所属的系统资源,但你需手动释放该线程的程序资源如:malloc(),mmap()
(3)一个线程终止后其系统资源不被释放则会变成一个僵尸线程,线程被创建时默认是不分离的
(3)int pthread_join(pthread_t tid,void **rval)
调用该函数的线程会变成阻塞状态,直到指定的线程id返回或者调用pthread_exit()或被取消,rval是指定线程的返回码的指针的指针
指定的线程必须不是分离的,否则会出错,被指定的线程会被分离,如果成功返回0,失败返回失败码
(4)调用int pthread_detach(pthread_t ptid)同样可以分离一个线程,成功返回0