Linux线程

线程的概念。

1. 线程   
    轻量级的进程
2. 线程的创建
    线程由某个进程创建,从属于某个进程
    
    内存:由所在进程为其分配独立的栈区空间(默认8M)

                与其他线程和所在的进程共用堆区,数据区,文本去。
                内核存储线程控制块。
                
               线程是cpu任务调度的最小单位
               进程是操作系统资源分配的最小单位

进程和线程的区别 :

1.    线程是cpu任务调度的最小单位
       进程是操作系统资源分配的最小单位

2.  线程是一个轻量级的进程,所在进程为其分配独立的栈区空间。

3.  资源消耗
      进程资源消耗> 线程
4.  效率角度
      线程创建比进程创建效率高
      线程任务切换比进程任务切换效率高
5.  安全角度
      多进程的安全性高于多线程,各个进程之间空间独立
6.  通信角度
      线程间数据共享方便
      进程间数据不能直接共享,需要使用进程间通信的通信方法实现。
3. 线程调度    
    宏观并行,微观串行  
4. 线程的消亡
      1.  线程退出
           return ,pthread_exit
      2.  回收线程(非分离属性)
            pthread_join 

相关函数

 创建线程:pthread_create *
     线程退出:return ,pthread_exit
     回收线程:pthread_join *
     线程ID:    pthread_self
       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
               失败:非0

int pthread_join(pthread_t thread, void **retval);
功能:阻塞等待回收线程资源
参数:
       thread:需要回收的线程tid
       retval:线程退出时,传递给回收线程的参数
返回值:
     成功:0
     失败 非0
 

线程的分离属性

对于创建线程的进程,无合适机会回收线程资源时, 可以将线程设置成具有分离属性的线程。

线程属性:

线程的分离属性:线程结束时,不需要其他线程回收,会被操作系统自动回收。
                                 (孤儿进程)
线程的非分离属性(默认):可以被其他线程回收(pthread_join)或者结束。
                                     (僵尸进程)

设置线程的分离属性:

1. 定义线程属性对象         pthread_attr_t attr;
2. 初始化线程属性对象     int pthread_attr_init(pthread_attr_t *attr);
3. 设置线程的分离属性     int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
4. 以分离属性创建线程     int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
5. 销毁线程属性对象    int pthread_attr_destroy(pthread_attr_t *attr);

线程的控制

互斥锁

互斥:

多线程访问临界资源时,存在资源竞争。造成数据错乱。

临界资源:多个线程可以同时操作的资源空间
                    全局变量、共享内存。

解决:

互斥:多个线程访问临界资源时,进行排他性访问(同一时刻只允许一个线程对该临界资源进行访问)。

互斥锁(lock):解决多线程访问临界资源时,存在资源竞争问题。
1. 创建互斥锁
        pthread_mutex_t mutex;
2. 初始化互斥锁
           int pthread_mutex_init(pthread_mutex_t *restrict mutex,
           const pthread_mutexattr_t *restrict attr);
      功能:初始化一个互斥锁
      参数:
                 restrict mutex:锁对象地址
                 restrict attr:锁的属性(NULL:默认属性)
       返回:
              成功:0
               失败:非0
3. 加锁
            int pthread_mutex_lock(pthread_mutex_t *mutex);
4. 解锁
           int pthread_mutex_unlock(pthread_mutex_t *mutex);

5. 销毁锁
            int pthread_mutex_destroy(pthread_mutex_t *mutex);
互斥锁是排他性访问

信号量是有顺序的排他性访问(同步)

多任务各自执行各自的任务,互相之间没有直接干扰(异步)

信号量

实现线程间同步

信号使用:

1. 定义信号量对象    sem_t 
2. 初始化信号量      
        int sem_init(sem_t *sem, int pshared, unsigned int value);
        功能:初始化信号量
        参数:
                   sem:信号量对象地址
                   pshared:
                              0 : 线程间使用
                              非0 : 进程间使用
                   value:初始化的资源数
         返回值:
                   成功:0
                    失败:-1
3. 申请信号量: P操作
        int sem_wait(sem_t *sem);
        当申请的信号量资源数>0, sen_wait解除阻塞,表示申请到了该信号量,信号量资源数-1;
        当申请的信号量资源数=0, sem_wait阻塞等待信号量的释放

4. 释放信号量: V操作
        int sem_post(sem_t *sem);
        该信号量的资源数会自动+1;   
5. 销毁信号量
       int sem_destroy(sem_t *sem);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值