zoukankan      html  css  js  c++  java
  • 线程3——信号量

    创建信号量,并赋予初值

    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
    ");
    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
    ",tid1);
    35     printf("New thread2 id:%ld
    ",tid2);
    36     printf("New thread3 id:%ld
    ",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
    ",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
    ",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
    ",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);
  • 相关阅读:
    深入浅出SQL教程之Group by和Having
    AFNetworking3.0 Https P12证书
    C#访问注册表
    One reason for not able to show chinese correctly in installation
    Debugging DLL loading issues with GFLAGS
    RegistryFree COM Registration
    RegistrationFree COM Interop
    net use
    MS UI Automation原来如此
    取景器的视野率和放大倍率
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/11674051.html
Copyright © 2011-2022 走看看