zoukankan      html  css  js  c++  java
  • 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. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到。



     

  • 相关阅读:
    第七组(69)团队展示
    结对编程作业
    同步异步和阻塞非阻塞
    TCP和UDP和IP和HTTP和socket
    http协议
    数据库基础知识
    准确的笑话
    Java实现多线程的方式
    HashMap
    HTTPS与HTTP
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3503567.html
Copyright © 2011-2022 走看看