信号量
信号量一般用于资源的访问控制和代码段的执行控制
其本质是一个计数器。信号量是在多线程环境下实现资源互斥访问或共享资源访问的方法,可以用来保证两个或多个关键代码段不被并发调用。在进入一个关键代码段之前,进程/线程必须获取一个信号量,一旦该关键代码段完成了,那么该进程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个进程释放信号量。
为了完成这个过程,需要创建一个信号量VI,然后将 Acquire Semaphore VI (获取信号量)以及 Release Semaphore VI (释放信号量)分别放置在每个关键代码段的首末端,确认这些信号量VI引用的是初始创建的信号量。
可以与共享内存结合使用实现最快的进程间通讯
消息队列
消息队列一般用于进程间或者线程间通信(数据传递)
消息队列本质是一个消息的链表,每个消息队列有一个队列头在用户态创建的时候生成,这个队列头描述了消息队列的key值,用户ID,组ID等信息,但它存于内核中,用户态程序通过消息结构体实现消息的写入和取出。
消息是按消息类型(type)访问,进程必须指定消息类型来读取消息,同样,当向消息队列中写入消息时也必须给出消息的类型,如果读队列使用的消息类型为0,则读取队列中的第一条消息。使用的时候调用msgsnd函数向链表push数据和msgrcv函数pop函数从链表取出数据(并删除当前数据)
文件锁
用于访问数据文件时的控制
文件锁本质是通过信号量控制read、write函数的调用来实现对文件的读写控制,读锁称为共享锁、写锁称为互斥锁,
共享锁之间互不干扰:可以有多个进程或者线程对文件进行“读”操作、但是不可以进行“写”操作
互斥锁之间互相制约:一个文件如果被线程加了互斥锁,只有当前线程可以进行“写”操作,别的线程既不可以进行“写”操作、也不可以进行“读”操作
互斥锁是用来保证多线程互斥的,比如,一个线程占用了某一个资源,那么别的线程就无法访问,直到这个线程离开,其他线程才开始可以利用这个资源,用来保证一段时间内只有一个线程在访问同一资源。
总结:
信号量和文件锁功能类似,都是为了保证一个资源(文件、代码段、共享内存)在同一时间只有一个线程访问;
消息队列和全局字符串功能类似,都是为了多线程或者多进程通信(传输数据)使用,同时数据的排列结构、写入消息、取出消息参考链表的特性