ipmsg学习笔记4—信号量和互斥锁1

来源:互联网 发布:板厂小学 知乎 编辑:程序博客网 时间:2024/05/16 10:03

信号量和互斥锁的区别

信号量用在多线程多任务同步的,一个线程完成了某一个动作就通过信号量告诉别的线程,别的线程再进行某些动作(大家都在sem_wait的时候,就阻塞在那里)。而互斥锁是用在多线程多任务互斥的,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程unlock,其他的线程才开始可以利用这个资源。比如对全局变量的访问,有时要加锁,操作完了再解锁。有的时候锁和信号量会同时使用的。

也就是说,信号量不一定是锁定某一个资源,而是流程上的概念,比如:有A,B两个线程,B线程要等A线程完成某一任务以后再进行自己下面的步骤,这个任务并不一定是锁定某一资源,还可以是进行一些计算或者流程数据处理。而线程互斥量则是“锁住某一资源”的概念,在锁定期间内,其他线程无法对被保护的数据进行操作。在有些情况下两者可以互换。


信号量分类

首先分为内核信号量和用户态信号量。
用户态信号量又分为posix信号量和system v信号量。(system v比较复杂,头文件为#include <sys/sem.h>;posix信号量比较简单,#include <semaphore.h>)

posix信号量又分为有名和无名信号量,POSIX信号量来源于POSIX技术规范的实时扩展方案(POSIX Realtime Extension),无名信号量常用于多线程;有名信号量可以用于多进程/多线程;

它的头文件为<semaphore.h>,函数调用为sem_init(),sem_wait(),sem_post(),sem_destory()等函数。

有名信号量必须调用下面的函数创建:
sem_t *sem_open(const char *name, int oflag, mode_t mode , int value);
Name用于标识信号量的名字
Oflag被设置为O_CREAT用来创建一个信号量(如果和0_EXCL一起,当这个信号量已经存在时候这个调用将会失败)
mode_t控制新的信号量的访问权限
Value指定信号量的初始化

system v信号量,常用于进程的同步。
它的头文件为<sys/sem.h>,函数调用为semctl(),semget(),semop()等函数。


原创粉丝点击