zoukankan      html  css  js  c++  java
  • 无名信号量在多线程间的同步

    //无名信号量的常见用法是将要保护的变量放在sem_wait和sem_post中间所形成的临界区内,这样该变量就会被//保护起来,例如:
    #include <pthread.h>
    #include <semaphore.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    int number; // 被保护的全局变量
    sem_t sem_id;
    void* thread_one_fun(void *arg)
    {
    sem_wait(&sem_id);
    printf("thread_one have the semaphore ");
    number++;
    printf("number = %d ",number);
    sem_post(&sem_id);
    }

    void* thread_two_fun(void *arg)
    {
    sem_wait(&sem_id);
    printf("thread_two have the semaphore ");
    number--;
    printf("number = %d ",number);
    sem_post(&sem_id);
    }

    int main(int argc,char *argv[])
    {
    number = 1;
    pthread_t id1, id2;
    sem_init(&sem_id, 0, 1);
    pthread_create(&id1,NULL,thread_one_fun, NULL);
    pthread_create(&id2,NULL,thread_two_fun, NULL);
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    sem_destroy(&sem_id);
    printf("main,,, ");
    return 0;
    }

    //上面的例程,到底哪个线程先申请到信号量资源,这是随机的。如果想要某个特定的顺序的话,可以用2个信号量//来实现。例如下面的例程是线程1先执行完,然后线程2才继续执行,直至结束。
    #include <pthread.h>
    #include <semaphore.h>
    #include <sys/types.h>
    #include <stdio.h>
    #include <unistd.h>
    int number; // 被保护的全局变量
    sem_t sem_id1, sem_id2;
    void* thread_one_fun(void *arg)
    {
    sem_wait(&sem_id1);
    printf("thread_one have the semaphore ");
    number++;
    printf("number = %d ",number);
    sem_post(&sem_id2);
    }

    void* thread_two_fun(void *arg)
    {
    sem_wait(&sem_id2);
    printf("thread_two have the semaphore ");
    number--;
    printf("number = %d ",number);
    sem_post(&sem_id1);
    }

    int main(int argc,char *argv[])
    {
    number = 1;
    pthread_t id1, id2;
    sem_init(&sem_id1, 0, 1); // 空闲的
    sem_init(&sem_id2, 0, 0); // 忙的
    pthread_create(&id1,NULL,thread_one_fun, NULL);
    pthread_create(&id2,NULL,thread_two_fun, NULL);
    pthread_join(id1,NULL);
    pthread_join(id2,NULL);
    sem_destroy(&sem_id1);
    sem_destroy(&sem_id2);
    printf("main,,, ");
    return 0;
    }

    /*建两个线程,这两个线程各自将自己的一个整型变量i从1 递增到100,并通过信号量控制递增的过程,即这两个整型变量的差不能超过5。*/
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    #include <stdio.h>
    #define MAX 100
    sem_t sem1,sem2;
    void* th_fn1(void* arg)
    {
    int i;
    for(i = 0; i < MAX; ++i)
    {
    sem_wait(&sem1);
    printf("numberin thread1 is %d ",i);
    sem_post(&sem2);
    }
    pthread_exit((void*)"thread1exit ");
    }
    void* th_fn2(void* arg)
    {
    int i;
    for(i = 0; i < MAX; ++i)
    { sem_wait(&sem2);
    printf("number in thread2 is %d ",i);
    sem_post(&sem1);
    }
    pthread_exit((void*)"thread2exit ");
    }
    int main(void)
    {
    void*tret;
    sem_init(&sem1,0,5);
    sem_init(&sem2,0,5);
    pthread_t tid1,tid2;
    pthread_create(&tid1,NULL,th_fn1,NULL);
    pthread_create(&tid2,NULL,th_fn2,NULL);
    pthread_join(tid1,&tret);
    pthread_join(tid2,&tret);
    sem_destroy(&sem1);
    sem_destroy(&sem2);
    return 0;
    }

  • 相关阅读:
    微软开源全新的文档生成工具DocFX
    .NET平台微服务项目汇集
    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC
    Microsoft开源跨平台的序列化库——Bond
    Oracle job procedure
    Windows10
    移动端Reactive Native轮播组件
    PHP完整环境搭建
    Webpack 入门
    git 提交
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4110973.html
Copyright © 2011-2022 走看看