创建信号量,并赋予初值
int sem_init(sem_t *sem, int pshared, unsigned int value);
销毁信号量
int sem_destroy(sem_t *sem);
阻塞,信号量数值-1
int sem_wait(sem_t *sem);
非阻塞申请
int sem_trywait(sem_t *sem);
计时申请一个信号量
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
发送信号量,数值 +1
int sem_post(sem_t *sem);
获取信号量值
int sem_getvalue(sem_t *sem, int *sval);
示例:和互斥锁案例相同
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <semaphore.h>
5
6
7 void* task1(void *arg);
8 void* task2(void *arg);
9 void* task3(void *arg);
10
11 static int i = 10 ;
12 static sem_t sem; //信号量指针
13
14
15 int main(void)
16 {
17 int ret;
18 sem_init(&sem,0,1); //初始化信号量 初值为1
19
20 //声明三个指针,指向线程的id
21 pthread_t tid1,tid2,tid3;
22 //创建三个新线程,用刚才的指针,
23 pthread_create(&tid1,NULL,task1,(void*)5);
24 pthread_create(&tid2,NULL,task2,(void*)6);
25 pthread_create(&tid3,NULL,task3,(void*)7);
26
27 printf("Main thread\r\n");
28 //等待线程结束运行
29 pthread_join(tid1,(void **)&ret);
30 pthread_join(tid2,(void **)&ret);
31 pthread_join(tid3,(void **)&ret);
32
33 sleep(1);
34 printf("New thread1 id:%ld\r\n",tid1);
35 printf("New thread2 id:%ld\r\n",tid2);
36 printf("New thread3 id:%ld\r\n",tid3);
37 //销毁信号量
38 sem_destroy(&sem);
39
40
41 }
42
43 void* task1(void *arg)
44 {
45 while(i<30){
46 //信号量-1
47 sem_wait(&sem);
48 i++;
49 printf("%d\r\n",i);
50 //信号量+1
51 sem_post(&sem);
52 usleep(1);
53 }
54 pthread_exit(NULL);
55
56 }
57
58 void* task2(void *arg)
59 {
60 while(i<30){
61 //信号量-1
62 sem_wait(&sem);
63 i++;
64 printf("%d\r\n",i);
65 //信号量+1
66 sem_post(&sem);
67 usleep(1);
68 }
69 pthread_exit(NULL);
70
71 }
72
73 void* task3(void *arg)
74 {
75 while(i<30){
76 //信号量-1
77 sem_wait(&sem);
78 i++;
79 printf("%d\r\n",i);
80 //信号量+1
81 sem_post(&sem);
82 usleep(1);
83 }
84 pthread_exit(NULL);
85
86 }
计时申请信号量:(结构体见上一篇条件变量)
1 struct timeval now; 2 struct timespec outtime; 3 gettimeofday(&now, NULL);//获取当前时间 4 outtime.tv_sec = now.tv_sec + 5; //设定唤醒的绝对时间是当前时间+5s 5 outtime.tv_nsec = now.tv_usec * 1000; 6 sem_timedwait(&sem, &outtime);