Chinaunix首页 | 论坛 | 博客
  • 博客访问: 28655
  • 博文数量: 7
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-10 15:39
个人简介

。。

文章分类

全部博文(7)

文章存档

2016年(7)

我的朋友

分类: 嵌入式

2016-06-12 14:34:52

功能:对共享资源实现互斥访问,保证访问的完整性

        如果使用互斥锁,每个线程在访问共享资源,都必须先获得互斥锁,然后在访问共享资源,如果无法获得互斥锁,则表示有其他线程正在访问共享资源,此时没有获得锁的线程会阻塞,直到其他线程释放锁,能再次获得锁。
核心:无序、竞争:不知道谁先获得互斥锁,谁后获得

流程:

1.定义互斥锁(全局变量,让每个线程都能访问到)
pthread_mutex_t lock;
@pthread_mutex_lock :联合体类型,知道是锁的类型就行,不用管具体,实在要看用vi -t 类型名  就可以查看
 (注意:如果初始化打算用静态的话,可以在定义锁的时候直接初始化

2.初始化
    1)动态初始化(线程创建之前初始化):
            int pthread_mutex_init(pthread_mutex_t *restrict mutexconst pthread_mutexattr_t *restrict attr);
    @mutex         :很简单,就是锁,但是为什么要加restrict修饰呢?
    (restrict 是一种c99引入的类型限定符,意思是mutex指向的内存单元数据只能通过mutex这个指针来操作,任何其他直接赋值或者间接操作:比如引入另外一个指针来代替mutex都不行)

    @attr            :前期先不管,知道是属性就行,通常用NULL代替;
     2)静态初始化:
            pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

3.获得互斥锁(变量用lock操作)
    1)int pthread_mutex_lock(&lock);
    2)int pthread_mutex_trylock(&lock);
(注意:每个线程持有锁的时间越少越好,所以要在线程操作共享资源之前加锁)

(一开始我有疑惑,trylock有意义吗?尝试获得锁,没有就继续执行,那我尝试不尝试获得锁也一样执行接下来的代码。
    解答:思维错误!锁执行的程序是针对共享资源的,trylock的意义在于:通过判断它立即返回的值,可以把对共享资源的代码和对非共享资源的代码区分开来,这样就不会一直阻塞在那里,浪费时间)

4.释放互斥锁(操作共享资源结束最好立马释放互斥锁)
    int pthread_mutex_unlock(&lock);

5.释放锁(确保没有一个线程在使用它才能销毁)
    int pthread_mutex_destroy(&lock);

互斥锁只能被短时间拥有,如果象等待输入这种持续时间不确定的情况,就不能用互斥锁。

阅读(2369) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~