信号量
函数功能说明
#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 }