信号灯 在进程同步和多线程处理中非常有用。但如何在现实生活中使用,比如说在C语言中?
我们在Linux系统中有POSIX信号库。让我们学习如何使用它。
信号量的基本代码如下所示 在这里 .但此代码不能直接编写,因为函数要求是原子的,直接编写代码会导致上下文切换而没有函数完成,并会导致混乱。
Linux中的POSIX系统提供了自己的内置信号量库。要使用它,我们必须:
- 包括信号量。H
- 通过链接-lpthread-lrt编译代码
要锁定信号灯或等待,我们可以使用 等等 功能:
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_销毁 .
sem_destroy(sem_t *mutex);
要声明信号量,数据类型为sem_t。
代码–
// C program to demonstrate working of Semaphores
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
sem_t mutex;
void
*
thread
(
void
* arg)
{
//wait
sem_wait(&mutex);
printf
(
"Entered.."
);
//critical section
sleep(4);
//signal
printf
(
"Just Exiting..."
);
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 a.c-lpthread-lrt完成
解释—— 正在创建两个线程,第一个线程后2秒创建一个线程。 但第一个线程在获得锁后将休眠4秒。 因此,第二个线程在被调用后不会立即进入,它将在被调用后进入4–2=2秒。 所以结果是:
Entered.. Just Exiting... Entered.. Just Exiting...
但不是:
Entered.. Entered.. Just Exiting... Just Exiting...
本文由 超级机器人 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。