linux下进程和线程
文章目录
linux 下进程和线程
其实在Linux内核2.4版以前,线程的实现和管理方式就是完全按照进程方式实现的。在2.6版内核以后才有了单独的线程实现。
进程是资源分配的基本单位,线程是调度的基本单位。
这句经典名言已流传数十年,各种操作系统教材都可见此描述。确实如此,这就是二者的显著区别。读者请注意“基本”二字。相信有读者看到前半句的时候就在心里思考,“进程岂不是不能调度?”,非也!进程和线程都可以被调度,否则多进程程序该如何运行呢!
只是,线程是更小的可以调度的单位,也就是说,只要达到线程的水平就可以被调度了,进程自然可以被调度。它强调的是分配资源时的对象必须是进程,不会给一个线程单独分配系统管理的资源。若要运行一个任务,想要获得资源,最起码得有进程,其他子任务可以以线程身份运行,资源共享就行了。
cpp 实现线程
|
|
编译方法:
|
|
|
|
查看文档
|
|
这个 void*
相当于java 的 Object表示任意类型
|
|
编译的命令太繁琐了,可以写一个编译脚本
|
|
ps -Lf 查看线程信息
|
|
互斥锁的使用
- pthread_mutex_t mutex
- phtread_mutex_init(&mutex)
- pthread_mutex_unlock(&mutex)
- pthread_mutex_destroy(&mutex)
死锁怎么防止 【线程死锁】
-
自己锁自己 【 可重入锁和不可重入锁,c++ 的是不可重入的】
-
加锁了 不释放锁 【 java 的解决方法就是 ,finally 释放锁】
-
尽量不要去锁多个资源 【尽量锁住一个】
- 如果要锁住多个资源,也要尽量都按照顺序上锁
- 不要嵌套加锁 【嵌套加锁就会有问题】
- 访问其他锁的时候,请先释放自己的锁【不要吃着碗里的,看着锅里的】
-
上锁的时候加个尝试时间 【超过时间自动退出】
-
防止异常发生,导致没有解锁
读写锁
读共享,写阻塞
适用于 读多写少的情况。
条件变量
-
条件变量本身不是锁, 但是可以引起阻塞,通常与互斥锁一起使用
- 使用互斥锁保护共享数据
- 使用条件 变量使线程阻塞,等待某个条件发生,条件满足的时候解除阻塞。
- 条件不满足,阻塞线程
- 条件满足,唤醒线程
|
|
信号量, semaphore
没错, java 的 juc 也有个 semaphore , 和 c++ 这个是一模一样的功能
允许最多多少个线程同时执行。
-
如果车库里面可用资源大于0,就不阻塞
-
如果可用资源小于等于 0 ,就阻塞当前线程,直到 可用资源大于0
文章作者 LYR
上次更新 2021-08-17