线/进程间同步互斥和进程间通信机制

一、线/进程间同步互斥

(1)互斥:一个进程或者线程是否可以获得资源的使用权
(2)同步:对资源是否能够有序访问

1.互斥机制

(1)互斥锁

  • pthread_mutex_init();//初始化锁(因为线程共享进程的资源,所以可以在进程中将锁声明为全局或静态变量)
  • pthread_mutex_destroy(); //释放锁
  • pthread_mutex_lock(); //获得锁,此时只有本线程能访问资源。如果锁被其他线程占用,这里无法获得锁,则本线程睡眠
  • pthread_mutex_trylock(); //获得锁。 如果锁被其他线程占用,这里会执行失败,返回EBUSY
  • pthread_mutex_unlock(); //资源调用完成后,释放锁

(2)自旋锁

  • DEFINE_SPINLOCK(lock);
  • spin_lock(&lock);
  • spin_unlock(&lock);

跟互斥锁的区别: 互斥锁如果获取不到锁会睡眠,自旋锁如果获取不到锁,会一直循环检测这把锁什么时候被别的线程释放,然后再上锁。
缺点: 一直占用CPU资源,如果线程等待时间比较长,CPU的效率就会下降

2.同步机制

(1)信号量

  • sem_t sem ; //声明一个信号量
  • sem_init(); //初始化信号量,这里信号量的值可以是多个
  • sem_wait(); //获得信号量,信号量的值减1 P操作
  • sem_post(); //释放信号量,信号量的值减1 V操作

可以定义多个信号量,初始化时给信号量赋值一个数就行,但一般只初始化一个信号量,用于2个线程

(2)条件变量

  • pthread_cond_t cond; //创建条件变量

  • pthread_cond_init(); //初始化条件变量

  • pthread_cond_destroy(); //

  • pthread_cond_wait(); //等待唤醒

  • pthread_cond_broadcast(); //唤醒所有等待这个条件变量的线程

  • pthread_cond_signal(); //唤醒某一个等待这个条件变量的线程

    条件变量和互斥锁一般搭配使用,用条件变量唤醒这个线程后,用互斥锁把资源锁死,只能本线程调用,工作都做完以后,再释放互斥锁,需要的话再唤醒另一个线程继续执行

二、进程间通信机制

1.无名管道(pipe)

2.有名管道(fifo)

3.消息队列(本质:一个消息的链表)

  • ftop(); //创建KEY,通过KEY来判断自己操作哪一个消息队列

  • msgget(key,属性); //创建或打开消息队列。属性:IPC_CREAT - 消息队列不存在则创建,存在则打开

  • msgsnd(); //发送消息;其中有一个指针用来表示要发送的消息,一般是一个消息结构体

  • msgrcv(); //接收消息

  • msgctl(); //操作消息队列,比如删除

      比如:用BOA服务器搭了一个网页,网页端跟嵌入式主控程序之间就可以通过消息队列传输数据
    

4.共享内存(最快的,效率最高的通信方式,因为操作的是同一个内存空间)

  • shmget(); //创建共享内存
  • shmat(); //映射共享内存
  • shmdt(); //接触映射
  • mmap(); /

5.信号量

6.socket套接字(TCP、UDP通信)

  • socket();创建socket套接字
  • 注册网络协议族
  • bind()绑定
  • listen()监听
  • connect()连接
  • accept()接受连接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值