信号量在进程同步和多线程中非常有用。但是如何在现实生活中使用它,例如用C语言说呢?
好吧,我们在Linux系统中有POSIX信号量库。让我们学习如何使用它。
信号灯的基本代码很简单,如此处所示。但是此代码无法直接编写,因为函数必须是原子函数,而直接编写代码将导致上下文切换而函数完成,并且会导致混乱。
Linux中的POSIX系统提供了自己的内置信号量库。要使用它,我们必须:
- 包括semaphore.h
- 通过与-lpthread -lrt链接来编译代码
要锁定信号量或等待,我们可以使用sem_wait函数:
int sem_wait(sem_t *sem);
要释放或发出信号量,我们使用sem_post函数:
int sem_post(sem_t *sem);
通过使用sem_init (对于进程或线程)或sem_open (对于IPC)来初始化信号量。
sem_init(sem_t *sem, int pshared, unsigned int value);
在哪里,
- sem :指定要初始化的信号量。
- pshared :此参数指定是否在进程之间或线程之间共享新初始化的信号量。非零值表示信号量在进程之间共享,而零值表示它在线程之间共享。
- value :指定要分配给新初始化的信号量的值。
要销毁信号量,我们可以使用sem_destroy 。
sem_destroy(sem_t *mutex);
要声明信号量,数据类型为sem_t。
代码 –
// C program to demonstrate working of Semaphores #include
#include #include #include sem_t mutex; void* thread(void* arg) { //wait sem_wait(&mutex); printf("\nEntered..\n"); //critical section sleep(4); //signal printf("\nJust Exiting...\n"); sem_post(&mutex); } int main() { sem_init(&mutex, 0, 1); pthread_t t1,t2; pthread_create(&t1,NULL,thread,NULL); sleep(2); pthread_create(&t2,NULL,thread,NULL); pthread_join(t1,NULL); pthread_join(t2,NULL); sem_destroy(&mutex); return 0; } 编译应使用gcc ac -lpthread -lrt
解释 –
正在创建2个线程,第一个线程之后2秒。
但是第一个线程在获取锁后将休眠4秒钟。
因此,第二个线程在调用后不会立即进入,而是在调用后进入4 – 2 = 2秒。
所以输出是:Entered.. Just Exiting... Entered.. Just Exiting...
但不是:
Entered.. Entered.. Just Exiting... Just Exiting...
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。