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

  • 相关阅读:
    SQL_Server_2005_字符串函数(描述及实例)
    固定在左右两侧不动的广告条 样式
    jquery 浏览器判断
    sqlserver 2005无限极分类 获取 所有子分类
    asp.net使用treeview控件,递归加载
    C++day15 学习笔记
    Win32编程day02 学习笔记
    Win32编程day04 学习笔记
    C++day16 学习笔记
    Win32编程day05 学习笔记
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4110973.html
Copyright © 2011-2022 走看看