Linux线程基本知识

来源:互联网 发布:c语言dll库详解 编辑:程序博客网 时间:2024/06/05 09:51
1、线程:由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,为了提高系统的性能,许多操作系统规范里引入了轻量级进程的概念,也被称为线程,在同一个进程中创建的线程共享该进程的地址空间,并且和进程一样都参与内核同一的调度。
2、进程和线程:
1)、线程是参与内核调度最小基本单位,进程是拥有资源的最小基本单位
2)、进程间相互独立,而同一个进程内的线程间共享进程内所有的资源
3)、多线程间通信简单,但是需要对临界资源进行互斥与同步操作,多进程间通信较难
4)、多线程安全性差,因为其中一个线程崩溃可能会对其他线程造成影响,多进程间相互独立,安全性高。
线程相关函数是由第三方库支持,所以编译时需要加上 -lpthread选项,man有关pthread函数之前要安装man手册包。
3、size +程序名,可以查看程序文件的段分布
4、ulimit -a 用来显示当前的各种用户进程限制
5、虽然在一个进程创建的线程共享该进程的地址空间,但是使用的栈却不是相同的,每创建一个线程,都会为其分配8M大小的栈。所以创建进程的个数是有限的。4G内存,只有0-3G可以用,那么可以创建382左右个线程.。
6、主线程和子线程被操作系统调度是随机的,主要是看操作系统心情。
7、当主线程退出时,整个进程里面的所有子进程都会随之退出
8、如果有线程调用exit或_exec函数,那么整个进程都会退出
9、pthread_exit( )调用这个函数的线程会退出,但是并不会释放线程分配的资源
10、prhread_join( )这个函数在线程退出后,释放线程资源。这个函数会一直阻塞直到等到相应的线程退出为止。
11、创建一个进程pthread_create(),这个函数的第二个参数是设置线程属性的,设置为NULL为使用默认值。最后一个参数是其第三个回调函数的参数,如果不传参数,写NULL。
12、如果想设置线程属性,那就可以给pthread_create( )传第二个参数
例如:因为现在栈的大小为8K,那么我们申请一个9K的数据a[9*1028*1028],编译运行之后,会有段错误,我们想修改栈的大小,由8K修改成10K
(1)pthread_attr_t attr;
(2)pthread_attr_init(&attr)初始化属性对象
(3)pthread_attr_setstacksize(&attr,10*1024*1024)
修改完之后就不会出现段错误了。
13、pthread_detach( )函数用来设置线程游离态。游离线程运行结束后,不需要其他线程来回收它未释放的资源,它的资源会自动被回收。
使用示例:pthread_detach(pthread_self())。 pthread_self()这个函数是用来获取当前进程的tid的。
14、pthread_cancel( )这个函数是用来发送一个取消请求给一个线程的。接受到取消请求的线程默认的处理方式是响应,也就是退出运行。
15、pthread_setcancelstate(int state, int *oldstate)设置线程收到取消请求后是否响应。
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);响应
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);不响应、忽略
16、pthread_setcanceltype(int type, int *oldtype)设置收到取消请求后,怎么响应
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);遇到断点函数时,退出运行
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);直接退出
17、互斥是对临界资源提出的概念,同步是对协同完成某一件事提出的概念
18、编译器优化-O(-O1、-O2、-O3,随着后面的数字增大,优化程度增强)
关键字volatile,防止编译器优化。
19、互斥机制:
引入互斥(mutual exclusion)锁的目的是用来保证共享数据操作的完整性。
互斥锁主要用来保护临界资源
每个临界资源都由一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源
线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止
互斥锁默认只能在线程间使用。通过修改int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutex‐attr_t *mutexattr);的第二个参数的属性,使其也可以在进程间使用。使用默认设置就传空。
加锁(若不成功阻塞):int pthread_mutex_lock(pthread_mutex_t *mutex);
加锁(所不成功返回):int pthread_mutex_trylock(pthread_mutex_t *mutex);
解锁:int pthread_mutex_unlock(pthread_mutex_t *mutex);
删除互斥锁:int pthread_mutex_destroy(pthread_mutex_t *mutex);
静态初始化的互斥锁:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
对于静态初始化的互斥锁,不需要调用 pthread_mutex_init() 函数。
20、拥有锁,也就是拥有解锁的权限,却等待着别人开锁,这就是死锁
21、一个线程解锁后,可以再次竞争锁,并且获得锁的概率是随机的,可能一直得到锁释放锁,也可能一直得不到锁,也可能在得到锁得不到锁交替运行。
22、条件变量,结合互斥锁一起使用,实现同步机制
pthread_cond_t cond
pthread_cond_init(&cond,NULL);
pthread_cond_wait(&cond);
pthread_cond_broadcast();广播,唤醒所有wait线程
pthread_cond_signal();只唤醒一个进程,但是在多处理器平台上,也可能唤醒多个wait进程,所以不是很稳定。
注意:pthread_cond_wait会先解除之前的pthread_mutex_lock锁定的mtx,然后阻塞在等待队列里休眠,直到再次被唤醒(大多数情况下是等待的条件成立而被唤醒,唤醒后,该进程会先加锁相当于pthread_mutex_lock(&mtx);了一下,然后才会再读取资源。
静态创建pthread_cond_t cond=PTHREAD_COND_INITIALIZER(常量)
动态创建int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr)
23、同步机制用信号量来实现:
信号量代表某一类资源,其值表示系统中该资源的数量
int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化一个信号量
参数:sem:信号量
pshared:0表示线程间,1表示进程间
value:初始化信号量的值
返回值:成功返回0,失败返回-1

int sem_wait(sem_t *sem)
功能:P操作,申请资源
参数:需要申请的信号量
返回值:成功返回0,失败返回-1

int sem_post(sem_t *sem)
功能:V操作,释放资源
参数:释放的信号量
返回值:成功返回0,失败返回-1


原创粉丝点击