1.采用信号量访问:当有段临界代码,需要保证排他的访问一个资源。

2.sudo  dmesg -c 消除dmesg缓冲

3.互斥锁:代表的是一种锁资源,互斥锁的工作原理是:保证对共享资源操作的原子性

4.自旋锁:轮循

5.读写锁:奇偶

6.顺序锁:读写可并发,但是会检测信号

      互斥锁中:

          死锁:(1)互斥锁交叉嵌套

             (2)同一个互斥锁嵌套使用

             (3)占有锁资源的任务被异常退出,锁资源不会释放,比如,一个线程开了一个锁,还没来得及解锁,线程就被取消了。

          避免死锁:申请锁,按顺序加锁,以防死锁。

 

7,锁和信号量不一样,比如要顺序执行时。

1).初始化互斥锁

    函数原型:  int pthread_mutex_init(pthread_mutex_t *restrict mutex,

                        const pthread_mutexattr_t *restrict attr);

      功能:  初始化互斥锁

      参数:   mutex   互斥锁的标识符

            attr       互斥锁的属性    NULL

      返回值:  成功:0

            失败 :错误码

2):执行上锁:

    函数原型:int pthread_mutex_lock(pthread_mutex_t *mutex);

    功能:  执行上锁操作

    参数:   mutex   互斥锁的标识符

    返回值:  成功 0

           失败:错误码

3):执行解锁

    函数原型: int pthread_mutex_unlock(pthread_mutex_t *mutex);

    功能:执行解锁操作

    参数: mutex 互斥锁的标识符

    返回值:成功 0 ;失败:错误码;

4):释放锁资源:

    函数原型:int pthread_mutex_destroy(pthread_mutex_t *mutex);

     功能:  摧毁锁资源

      参数: mutex互斥锁的标识符

     返回值: 成功0

          失败:错误码

 

信号量:

申请信号量:p操作   -1

释放信号量:v操作  +1

当执行任务,申请信号量时,如果当前信号量的值大于0,申请成功,信号量减一,不大于0 则申请失败。会阻塞。

 

1)初始化信号量的值

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

      功能: 初始化信号量

       参数:sem 信号量的标识符

           pashred  0  用于线程间

                非0  用于进程间

            value      信号量的初始值

       返回值: 成功    0

            失败   -1

2)申请信号量

    int sem_wait(sem_t *sem);

      功能:申请信号量,信号量的值-1;

      参数:sem 信号量的标识符

      返回值:成功    0

          失败  -1

3)释放信号量

    int sem_post(sem_t *sem);

       功能:释放信号量   信号量的值+1;

        参数:sem  信号量的标识符

        返回值  成功   0

            失败  -1

4)摧毁信号量

    int sem_destroy(sem_t *sem);

      参数:  sem 信号量的标识符

      返回值: 成功   0

          失败  -1

5)获取当前信号量的值

    int sem_getvalue(sem_t *sem,int  *sval);

      参数: sem:信号量的标识符

          sval  保存当前信号量的值。

 

posted on 2018-07-30 19:02  子都  阅读(155)  评论(0编辑  收藏  举报