LINUX线程

LINUX线程

线程的概念

线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix
System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel
thread),而把用户线程(user thread)称为线程。

进程与线程的关系

轻量级进程(light-weight process),也有PCB,创建线程使用的底层函数和进程一样,都是clone
进程间相互独立,统一进程的各个线程间共享。
从内核里看进程和线程是一样的,都有各自不同的PCB,但是PCB中指向内存资源的三
级页表是相同的
线程的切换和调度要比进程快得多
线程的优点
提高程序的并发性
开销小,不用重新分配内存
通信和共享数据方便
线程的缺点
线程不稳定(库函数实现)
线程调试比较困难(gdb支持不好)
线程无法使用unix经典事件,例如信号

线程头文件
#include<pthread.h>
gcc编译加上 -pthread

线程函数原语

创建一个新的进程

int  pthread_create(pthread_t *thread,
			pthread_attr_t *attr,
			void*(*start_routine)(void*),
			void *arg);

thread:新线程创建成功后,保存新线程的标识符
attr:设置线程的属性,一般不需要什么特殊的属性,直接传 NULL即可
start_routine: 是个函数地址,线程启动后要执行的函数
arg:传给线程启动函数的参数

调用线程的tid’

#include <pthread.h>
pthread_t pthread_self(void);

线程退出

#include <pthread.h>
void pthread_exit(void *retval);
void *retval:线程退出时传递出的参数,可以是退出值或地址,如是地址时,不能是线程内部申请的局部地址。

注意和exit函数的区别,任何线程里exit导致进程退出,其他线程
未工作结束,主控线程退出时不能return或exit

回收线程

int pthread_join(pthread_t th, void **thread_return);

pthread_t thread:回收线程的tid
void **retval:接收退出线程传递出的返回值
返回值:成功返回0,失败返回错误号

数pthread_join用来等待一个线程的结束,pthread_join的调用者将被挂起并等待thread线程终止。
以不同的方法结束线程会返回不同的值:
thread线程通过return返回:
retval所指向的单元里存放的是thread线程函数的返回值

调用pthread_cancel异常终止掉:
retval所指向的单元里存
放的是常数PTHREAD_CANCELED

thread线程是自己调用pthread_exit终止的:
retval所指向的单元存放的是传给
pthread_exit的参数
对thread线程的终止状态不感兴趣,可以传NULL给retval参数

在进程内某个线程可以取消另一个线程。

#include <pthread.h>
int pthread_cancel(pthread_t thread);

被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED的值是-1
线程也可以被置为detach状态,这样的线程一旦终止就立刻回收
它占用的所有资源,而不保留终止状态
如果已经对一个线程调用了pthread_detach就不
能再调用pthread_join了

线程同步

为什么要线程同步
1.共享资源,多个线程都可对共享资源操作
2.线程操作共享资源的先后顺序不确定
3.处理器对存储器的操作一般不是原子操作
线程中共享数据是如何发生冲突的
在这里插入图片描述
mutex操作原语
pthread_mutex_t
pthread_mutex_init
pthread_mutex_destroy
pthread_mutex_lock
pthread_mutex_trylock
死锁
线程一拥有A锁,请求获得B锁;线程二拥有B锁,请求获得A锁

互斥量
互斥量他是实现多进程访问的一种手段。在一个线程访问时将其锁起。程序员给莫给对象加一把锁,一次只允许一个线程访问他
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int pthread_mutex_destroy(pthread_mutex_t *mutex);
//销毁锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//建议锁,在外面没有钥匙的线程也可以访问
int pthread_mutex_unlock(pthread_mutex_t *mutex);
临界区
保证在某一时刻只有一个线程能访问数据的简便方法,再临界区中一个进程正在访问其他进程则会处于等待状态,临界区的选定因尽可能小,如果选定太大会影响程序的并行处理性能

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值