1:信号量头文件:
#include <semaphore.h>
2:定义信号量:
sem_t AAA;
3:初始化信号量:
sem_init(&AAA, X, Y);
AAA:定义的信号量结构的指针;
X:一般设置成0,表示此信号量在当前进程的所有线程共享;不为0,表示此信号量在进程间共享;
Y:给信号量的初始化值;
4:用来增加信号量初始化Y的值,每次会使初始化Y的值 “+1”,该操作是原子操作,即不同线程或进程同时调用该函数,不会发生冲突,都会实现(例如A B C三个线程都调用了此函数增加信号量AAA的值,产生的结果是 “Y = Y + 3 ”);但是如果不同线程对于同一个文件进行读、加和写操作的两个程序就有可能会引起冲突。
sem_post(&AAA);
5:用来减少信号量初始化Y的值,每次会使初始化Y的值 “-1”,该操作是原子操作,即不同线程或进程同时调用该函数,不会发生冲突,都会实现(例如A B C三个线程都调用了此函数增加信号量AAA的值,产生的结果是 “Y = Y - 3 ”);假设当前Y的值为1,A B C三个线程同时调用了该函数,则只有最先调用sem_wait(假定是A)A的会 “-1”,并继续向下运行,另外两个线程B和C会继续等待,直到有其他的线程或者进程调用sem_post(&AAA)来使信号量的值不为0,才会继续向下运行(如果信号量的值增加了1,即Y等于1,那么B和C中只有一个线程可以运行,另外一个需要继续等待其他的线程或者进程调用sem_post(&AAA)来使信号量的值不为0)。
注释:只有在信号量Y值不为0的时候,才会执行 -1的操作,并向下执行,当前如果信号量Y值为0,会卡在当前位置等待,直到Y值不为0.
sem_wait(&AAA);
5:释放信号量:
sem_destroy(&AAA);