信号定义------ sem_t sem_H,sem_W;(几个信号)
初始化:(在线程运行起来)--------sem_init(&sem_H,0,1);
--------sem_init(&sem_W,0,0) ;
/ /第一个0 表示是在运行线程非零则必表示运行进程般为0;
/ /第二个:1表示先进行,0表示后进行;
pv(申请)---------- 该不该走--------sem_wait(&sem_H);//谁走写谁
释放 -------sem_post(&sem_W);//原本的0初值变为1,开始走
销毁 ------------ sem_destroy( & sem_H ) ;
----------- sem_destroy( & sem_W ) ;
1 实现hello,world 的先后出现
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #include<unistd.h>
5 #include<semaphore.h>
6 #include<pthread.h>
7 sem_t sem_H,sem_W;
8 void *th1(void *arg)
9 {
10 int i=10;
11 while(i--)
12 {
13 sem_wait(&sem_H);//调用一次wait相当于减1次
14 printf("hello");
15 fflush(stdout);
16 sem_post(&sem_W);//变化sem_W的0-1
17 }
18 return NULL;
19 }
20 void *th2(void *arg)
21 {
22 int i=10;
23 while(i--)
24 {
25 sem_wait(&sem_W);
26 printf(",world\n");
27 // fflush(stdout);
28 sleep(1);
29 sem_post(&sem_H);
30 }
31 return NULL;
32 }
33
34
35 int main(int argc, const char *argv[])
36 {
37 pthread_t tid1,tid2;
38 pthread_create(&tid1,NULL,th1,NULL);
39 pthread_create(&tid2,NULL,th2,NULL);
40
41
42 sem_init(&sem_H,0,1);//先走
43 sem_init(&sem_W,0,0);//后走
44
45 pthread_join(tid1,NULL);
46 pthread_join(tid2,NULL);
47
48 sem_destroy(&sem_H);//销毁
49 sem_destroy(&sem_W);
50 return 0;
51 }
~
2 计数形式的
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem_WIN;
void* th(void* arg)
{
sem_wait(&sem_WIN);
printf("get win\n");
sleep(rand()%5);
printf("relese win\n");
sem_post(&sem_WIN);
return NULL;
}
int main(int argc, char *argv[])
{
srand(time(NULL));
pthread_t tid[10];
int i = 0 ;
//计数信号量
sem_init(&sem_WIN,0,3);
for(i = 0 ;i<10;i++)
{
pthread_create(&tid[i],NULL,th,NULL);
}
for(i = 0 ;i<10;i++)
{
pthread_join(tid[i],NULL);
}
sem_destroy(&sem_WIN);
return 0;
}