Linux学习笔记21——线程同步的两种方式

  用信号量同步
  1 信号量函数的名字都以sem_开头,线程中使用的基本信号量函数有4个

  2 创建信号量

#include<semaphore.h>

int sem_init(sem_t *sem,       //指向信号量结构的一个指针
        int pshared,      //控制信号量的类型,如果其值为0,就表示这个信号量是当前进程的局部信号量,否则,这个信号量就可以在多个进程之间共享
        unsighed int value   //信号量的初始值
       );

  这个函数初始化由sem指向的信号量对象,设置它的共享选项,并给它的一个初始的整数值。

  3 信号量操作函数

#include <semaphore.h>

int sem_wait(sem_t *sem);    //参数指针指向的对象是由sem_init调用初始化的信号量 int sem_post(sem_t *sem); 

  sem_post函数的作用是以原子操作的方式给信号量的值加1.原子操作是指,如果两个线程企图同时给一个信号量加1,它们之间不会互相干扰
  sem_wait函数以原子操作的方式将信号量的值减1,但它会等待直到信号量有个非零值才会开始减法操作
   4 信号量销毁函数

#include <semaphore.h>

int sem_destroy(sem_t *sem);   //作用:用完信号量后对它进行清理

  5 这些函数在成功时都会返回0

二 用互斥量同步

  1 互斥量初始化

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex,
              const pthread_mutexattr_t *mutexattr   //属性参数允许我们设置互斥量的属性,而属性控制着互斥量的行为,属性默认类型为fast
             );

  2 互斥量锁定

#include <pthread.h>
int
pthread_mutex_lock(pthread_mutex_t *mutex);

  3 互斥量解锁

#include <pthread.h>
int
pthread_mutext_unlock(pthread_mutex_t *mutex);

  4 互斥量销毁

#include <pthread.h>
int
pthread_mutex_destroy(pthread_mutex_t *mutex);

 

三 信号量与互斥量的区别

  1. 互斥量用于线程的互斥,信号量用于线程的同步。

  这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

  互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

  同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

  以上区别是主要想记住的。

  note:信号量可以用来实现互斥量的功能

  2. 互斥量值只能为0/1,信号量值可以为非负整数。

  也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

  3. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。



 

你可能感兴趣的:(linux)