线程是进程内部的一条执行序列或执行路径一个,一个进程可以包含多个线程。
事实上,Linux实现线程的机制非常独特,从内核的角度来说,它并没有线程这个概念。Linux把所有的线程都当做进程来实现。内核并没有准备特别的调度算法或是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程,每个进程都拥有唯一隶属于自己的tast_struct,所以在内核中,它看起来就像是一个普通的进程(只能该进程和其他的一些进程共享某些资源,比如地址空间)。这种机制的实现与windows或者Sun Solaris等 *** 作系统的差异非常大。[^1]
- 内核级线程:多核处理器使用不同的内核创建线程(Linux用的就是这个)。
优点:不同处理器可以处理不同的线程,可以实现并行 缺点:创建开销较大 - 用户级线程:无论内核是否支持创建线程,在用户层次创建线程,内核只用一个
优点:创建开销较小,可以创建很多线程 缺点:内核感知不到多线程的存在,无法使用多个处理器,无法线程并行 - 组合级线程:内核级和用户级的组合,优点的集合
进程是资源分配的最小单位,线程是CPU调度的最小单位
进程拥有自己独立的地址空间,线程共享进程中的地址空间
进程的创建消耗资源大,线程的创建相对消耗资源小
进程的切换开销大,线程的切换开销相对小
#创建线程:pthread_create(phread_tthread//接受创建的线程id,const pthread_attr_tattr//指定线程的属性,void*(start_routine)(void)//指定线程函数,void*arg//给线程函数传递的参数); 成功返回0,失败返回错误码
3.2退出函数:int pthread_exit(void *retval); 3.3等待函数:加粗样式
int pthread_join(pthread_t thread, void**retval);
注:编译带有线程头文件时要写成gcc -o main main.c -lpthread的形式 4. 线程同步
线程同步指的是当一个线程在对某个临界资源进行 *** 作时,其他线程都不可以对这个资源进行 *** 作,直到该线程完成 *** 作,其他线程才能 *** 作,也就是协同步调,让线程按预定的先后次序进行运行。线程同步的方法有四种:互斥锁、信号量、条件变量、读写锁。
5. 线程安全线程安全即就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。要保证线程安全需要做到:
1) 对线程同步,保证同一时刻只有一个线程访问临界资源。
2)在多线程中使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如果一个函数能被多个线程同时调用且不发生竟态条件,则我们程它是线程安全的。
如strtok的安全函数strtok_r
[^1]Linux内核设计与实现第三版
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)