线程的基本概念以及相关函数

线程的基本概念以及相关函数

【1】线程的概念

1. 每个用户进程有自己的虚拟地址空间
2. 系统为每个用户进程创建一个
	task_struct 来描述该进程 struct task_struct 
3. task_struct 和地址空间映射表一起用来表示一个进程
4. 由于进程的虚拟地址空间是私有的,因此进程切换开销很大
5. 为了提高系统的性能,linux引入轻量级进程, 起名为线程
6. 在同一个进程中创建的线程共享该进程的地址空间
7. Linux里同样用task_struct来描述一个线程。

线程和进程都参与统一的调度

总结:
1. 通常线程指的是共享相同虚拟地址空间的多个任务
2. 使用多线程, 大大提高了任务切换的效率

线程不需要虚拟内存,为什么?

每个进程中至少有一个线程,就是主线程,还可以产生多个线程

共享4G内存空间,线程切换只需要虚拟CPU(寄存器)

同样用task_struct来描述一个线程,线程和进程都参于统一的调度


进程代表资源分配的最小单位
线程是最小的调度单位

【2】线程相关的函数

pthread_t tid;  //线程号

创建线程
int pthread_create(pthread_t *thread, 
const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
/***************************************
*功能:创建线程
*参数:@thread   线程号的地址  &tid
*	   @attr     线程的属性 默认 NULL
*	   @start_routine  线程的函数名字
*      @arg		传递给线程函数的参数,一般NULL
*返回值: 成功: 0
*		 失败: -1 errno
****************************************/	

回收线程资源

int pthread_join(pthread_t thread, void **retval);
/***************************************
*功能: 阻塞等待指定线程退出,
*		接收退出状态并回收子线程资源
*参数:@thread   线程号
*	   @retval   返回值
*返回值: 成功: 0
*		 失败: -1 errno值
****************************************/

int pthread_detach(pthread_t thread);
/***************************************
*设置线程为detach,这样线程退出, 资源自动释放,无需使用pthread_join
****************************************/

结束子线程

void pthread_exit(void *retval);
/***************************************
*功能:
*参数:@retval 线程退出时返回的值,可被其他线程通过pthread_join获取
*返回值: 无
****************************************/

注意:
pthread_exit == return


线程传参{
	值
	地址
}


int pthread_cancel(pthread_t thread);
/***************************************
*功能: 在线程中发送关闭指定线程的请求
*参数:@thread   线程号
*返回值: 成功: 0
*		 失败: 负数,更新 errno
****************************************/

优点:线程间很容易进行通信
   通过全局变量实现数据共享和交换

缺点:多个线程同时访问共享对象
    时需要引入同步和互斥机制


同步和互斥 :保护共享资源,避免竟态

同步:多个任务按理想的顺序/步调来进行
互斥:不能同时访问

都是为了避免竟态:多个任务同时访问共享资源

【3】线程的同步------信号量

sem_t sem;
sem_init(&sem,0,0);//信号量的初始化,,1是进程/0是线程,设置初值为0
sem_wait(&sem);//信号量减1,等于0时阻塞 P 等待
sem_post(&sem);//信号量加1,V 唤醒


P -1 申请资源 任务继续运行 本来就是0 就会阻塞
V +1 释放资源


//主线程等待子线程结束
//计算键盘输入字符串的个数

【4】线程的互斥------互斥锁

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL); //初始化锁
pthread_mutex_lock(&mutex);	//加锁
pthread_mutex_unlock(&mutex); //解锁
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值