第四周--------->线程2

目录

5、线程间数据(栈区)的通信

5.1主线程给子线程传值

5.2子线程给主线程传值

6、线程中需要解决的问题

6.1互斥

6.1.1互斥锁的作用

6.1.2互斥锁的基本函数

6.2同步

6.2.1信号量的引用

6.2.2信号量的函数


5、线程间数据(栈区)的通信

5.1主线程给子线程传值

5.2子线程给主线程传值

pthread_exit()和pthread_join()配合使用

6、线程中需要解决的问题

由于线程共享进程的资源和地址空间,因此在对这些资源进行操作时,必须考虑到线程间资源访问的同步与互斥问题。

6.1互斥

       多线程不允许同时访问临界资源。

6.1.1互斥锁的作用

引入互斥(mutual exclusion)锁的目的时用来保证共享数据操作的完整性。

互斥锁主要用来保护临界资源

每个临界资源都有一个互斥锁来保护,任何时刻最多只能有一个线程能访问该资源。

线程必须先获得互斥锁才能访问临界资源,访问完资源后释放该锁。如果无法获得锁,线程会阻塞直到获得锁为止。

互斥锁只有两种状态:上锁和解锁。

6.1.2互斥锁的基本函数

(1)互斥锁初始化:pthread_mutex_init()。

(2)互斥锁上锁:pthread_mutex_lock()。

(3)互斥锁判断上锁:pthread_mutex_trylock()。

(4)互斥锁解锁:pthread_mutex_unlock()。

(5)消除互斥锁:pthread_mutex_destroy()。

pthread_mutex_init()函数语法要点

#include<pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutexattr_t *mutexattr);

mutex:互斥锁

Mutexattr:互斥锁属性,NULL表示缺省属性

返回值:成功 0,出错 返回错误码

pthread_mutex_lock()等函数语法要点

#include<pthread.h>

int pthread_lock(pthread_mutex_t *mutex);//加锁,若不成功则阻塞

int pthread_mutex_trylock(pthread_mutex_t *mutex);//加锁,若不成功则返回

int pthread_mutex_unlock(pthread_mutex_t *mutex);//解锁

int pthread_mutex_destroy(pthread_mutex_t *mutex);//删除互斥锁

mutex:互斥锁

返回值:成功 0,失败 -1

未加锁:

加锁:

6.2同步

多线程再访问临界资源时,按照一定的操作顺序来访问。

信号量:

              有名信号量:多进程实现同步

              无名信号量:多线程同步

              信号灯集:多进程实现同步

6.2.1信号量的引用

       信号量代表某一类资源,其值表示系统中该资源的数量,信号量的值为非负整数,它被用来控制对公共资源的访问。

       信号量是一个受保护的变量,只能通过三种操作来访问

              初始化   sem_wait()     sem_trywait()

              P操作(申请资源)-1     sem_wait()     sem_trywait()

                     在信号量大于零时,他们都能将信号量值为零时,阻塞线程

              V操作(释放资源)+1    sem_post()

                     将信号量的值加1,同时唤醒等待的线程。

6.2.2信号量的函数

int sem_init(sem_t *sem,int pshared,unsigned int value);

int sem_wait(sem_t *sem);   //P操作

int sem_post(sem_t *sem);

int sem_trywait(sem_t *sem);

int sem_getvalue(se,_t *sem,int *svalue);   //获得信号量的值

int sem_destroty(sem_t *sem);    //删除信号量

init

#include<semaphore.h>

int sem_init(sem_t *sem,int pshared,unsignes int value)

参数 sem:初始化的信号量

        pshaewd:信号量共享的范围(0:线程间使用 非0:进程间使用)

        value:信号量初值

返回值 成功:0          出错:-1

wait

#include<semaphore.h>

int sem_wait(sem_t *sem)    //P操作 >0

参数 sem:信号量 信号量>0      -1 申请资源

                                   ==0          阻塞线程

返回值 成功:0   出错:-1

post

#include<semaphore.h>

int sem_wait(sem_t *sem)    //V操作 释放资源

参数 sem:信号量             +1唤醒阻塞的线程

返回值 成功:0   出错:-1

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值