信号量

 

函数功能说明

#include <semaphore.h>


int sem_init(sem_t *sem,int pshared,unsigned int value);   // 初始化信号量(信号量地址,[0线程,>=1进程],初始值) 
int sem_destroy(sem_t *sem);                    // 销毁由sem指向的匿名信号量(信号量地址)  int sem_wait(sem_t *sem);                      // 将非负值的信号量的值减一,立即返回,否者阻塞(信号量地址) int sem_trywait(sem_t *sem);                    // 信号量的当前值为0,则返回错误而不是阻塞调用(信号量地址) int sem_post(sem_t *sem);                      // 信号量的值加一(信号量地址) int sem_getvalue(sem_t *sem, int *sval);             // 把 sem 指向的信号量当前值放置在 sval 指向的整数上(信号量地址,保存信号量地址) 成功返回 0;错误返回 -1,并设置 errno 来指明错误

 

线程信号量示例 

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include "../c_head.h"
 5 
 6 
 7 char count = 0;
 8 sem_t sem;
 9 pthread_t thread; 
10 
11 void thread_test(void)
12 {
13     do {
14         count = ++count % 10;
15         sem_post(&sem);
16         sleep(1);
17     } while(1);
18 }
19 
20 int main(void)
21 {
22     sem_init(&sem, 0, 0);
23     if(pthread_create(&thread, NULL, V(thread_test), NULL)) dbge();    
24     do {
25         sem_wait(&sem);
26         dbg("%d", count); 
27     } while(1);
28     
29     sem_destroy(&sem);
30     return 0;
31 }

 

 

进程信号量示例

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <semaphore.h>
 4 #include "../c_head.h"
 5 
 6 
 7 char count = 0;
 8 
 9 int main(void) 
10 {
11     dbg("一页大小 %ldbytes \tsem_t=%ld", sysconf(_SC_PAGE_SIZE), sizeof(sem_t));
12     
13     sem_t *sem = mmap(NULL, 1, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
14     
15     sem_init(sem, 1, 0);
16     
17     char *p = C(sem) + sizeof(sem_t);
18     int pid;
19     if(-1 == (pid = fork())) dbge();
20     if(!pid) {
21         do {
22             *p = (*p + 1) % 10;  
23             sem_post(sem);
24             sleep(1);
25         } while(1);        
26     } 
27     
28     do {
29         sem_wait(sem);
30         dbg("%d", *p); 
31     } while(1);
32     
33     sem_destroy(sem);
34     return 0;
35 }

 

 

 

 

 

 

   

 

posted @ 2021-12-03 18:00  迷人的危险~  阅读(32)  评论(0编辑  收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css