Day36_线程同步

来源:互联网 发布:linux mount phyaddr 编辑:程序博客网 时间:2024/05/21 21:02
Unix 线程同步技术:互斥量、信号量、条件变量(了解)
  由于同一进程内部的多线程共享进程的资源,因此有可能出现共享数据的冲突,解决方案就是线程同步技术。互斥量是pthread.h自身提供的同步技术,信号量是外部提供的。同步技术的 基础方法就是把并行改为串行,所以 大幅降低效率。因此同步技术只用于限制对共享资源的使用
  线程同步技术之互斥变量(锁):
    互斥量的功能就是给临界资源加一把锁,只有第一个线程能使用,后面再来的线程阻塞,直到第一个线程释放互斥锁为止(解除阻塞后哪个线程能拿到互斥锁是不一定的)
  互斥锁的使用步骤:
   1.生命互斥量(mutex)
     pthread_mutex_t lock;
   2.初始化互斥量
     pthread_mutex_init(&lock,0);
     或在声明的同时赋值
     pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;
   3.上锁 pthread_mutex_lock(&lock);
   4.使用共享资源
   5.解锁 pthread_mutex_unlock(&lock);
   6.释放互斥量占用的资源(回收互斥量)
     pthread_mutex_destroy(&lock);  
     
  线程同步技术之信号量
   信号量(semaphore) 本身就是一个计数器,控制访问共享资源的并行线程总数。信号量计数为1;效果等同于互斥量。
    信号量不属于线程规范,头文件也不是 pthread.h,而是semaphore.h。
     信号量使用步骤和互斥量差不多:
   1 声明信号量
   sem_t sem;
   2 初始化信号量(初始化计数)
   sem_init(&sem,0,n);
   参数&sem是信号量的指针
   第二个参数0  代表控制是线程,如果是其他值,代表控制是进程。
   第三个参数n  是计数为n,最多n个线程并行。
   3 获取信号量(计数减1)
    sem_wait(&sem);
   4 访问共享资源
   5 释放信号量(计数+1)
   6 回收信号量的资源
   sem_destory(&sem);
关于  死锁
  线程a和线程b代码如下:
   a:
    mutex lock1 lock2;
    lock(&lock1);
    lock(&lock2);
    ....
    unlock
    

原创粉丝点击