进程概念
在Linux系统中,"进程"是指正在运行的程序的实例。每个进程都有自己的独立地址空间,包括代码、数据、堆栈等。进程是操作系统进行资源分配和调度的基本单位,它们可以相互独立运行并与其他进程共享资源。
通俗的讲就是一个 .exe、a.out等二进制可执行文件运行后 就叫进程,与其说是程序在运行,不如说是进程在运行。
线程概念
线程是进程中的实际执行单元。在一个进程中,可以有多个线程同时执行不同的任务,每个线程都共享进程的资源,包括内存空间、文件和打开的文件描述符等。但是每个线程都有自己独立的栈空间,和独立的寄存器。
进程和线程的区别
线程与进程的区别在于,进程是操作系统分配资源的基本单位,而线程是进程中实际执行任务的单位。
通俗点理解:一个进程可以是一个线程,一个进程也可以由很多个线程组成。
线程的优点和缺点
优点
- 创建一个新线程的代价要比创建一个新进程小得多
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
- 线程占用的资源要比进程少很多
- 能充分利用多处理器的可并行数量
- 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务
- 计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
- I/O密集型应用,为了提高性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。
缺点
- 性能损失 :一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变。
- 健壮性降低:编写多线程需要更全面更深入的考虑,在一个多线程程序里,因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的,换句话说线程之间是缺乏保护的。
- 缺乏访问控制:进程是访问控制的基本粒度,在一个线程中调用某些OS函数会对整个进程造成影响。
- 编程难度提高:编写与调试一个多线程程序比单线程程序困难得多
线程异常和线程用途
线程异常
- 单个线程如果出现除零,野指针问题导致线程崩溃,进程也会随着崩溃
- 线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,进程终止,该进程内的所有线程也就随即退出
线程用途
- 合理的使用多线程,能提高CPU密集型程序的执行效率
- 合理的使用多线程,能提高IO密集型程序的用户体验(如生活中我们一边写代码一边下载开发工具,就是多线程运行的一种表现)
Linux下线程创建
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
参数
thread:线程ID
attr:用于设置新线程的属性,通常设置为"NULL"表示无特殊属性
start_routine: 是一个回调函数 用来表示这个线程下来要执行的任务
arg:输入型参数,需要传给回调函数
返回值:成功返回0,失败返回错误码
线程创建示例代码
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
//新线程所执行的任务 循环打印 I'am a new thread
void *rout(void *arg)
{
for (;;)
{
printf("I'am a new thread \n");
sleep(1);
}
}
int main(void)
{
pthread_t tid;
int ret;
if ((ret = pthread_create(&tid, NULL, rout, NULL)) != 0)
{
fprintf(stderr, "pthread_create : %s\n", strerror(ret));
exit(EXIT_FAILURE);
}
int i;
for (;;)
{
printf("I'am main thread\n");
sleep(1);
}
}
其他线程相关函数
pthread_join()
:等待一个线程的结束,并获取它的返回值(如果有)。
pthread_exit()
:终止当前线程的执行,并返回一个值给等待它的其他线程。
pthread_cancel()
:取消指定线程的执行。
pthread_detach()
:将一个线程标记为“分离状态”,使得线程结束时可以自动释放资源。
pthread_mutex_init()
:初始化互斥锁。
pthread_mutex_lock()
:加锁一个互斥锁。
pthread_mutex_unlock()
:解锁一个互斥锁。
pthread_cond_init()
:初始化条件变量。
pthread_cond_wait()
:等待条件变量满足。
pthread_cond_signal()
:发送信号通知条件变量的等待者。
pthread_cond_broadcast()
:发送信号通知所有条件变量的等待者。