同步 semaphore ,什么是死锁

 信号定义------ 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 }
~       

 

de694261e7414f7c857be2dfb62c8ee8.png

 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;
}

b12a88aacf38431590ccb4b591eb2674.pngdd5ad30db0c14657bdf1f602fc22e8aa.png

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值