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

    /*semopen_pth.c*/
    #include <stdio.h>
    #include <semaphore.h>
    #include <fcntl.h>
    #include <pthread.h>
    #include<stdlib.h>
    void print();
    void * thread_function(void *arg);
    sem_t * sem;
    int main(int argc,char * argv[])
    {
    int n=0,i=0;
    pthread_t tid[5];
    if(argc != 2)
    {
    printf("Usage:%s name. ",argv[0]);
    exit(0);
    }
    //init semaphore
    sem=sem_open(argv[1],O_CREAT,0644,3);
    while(n++<5)
    {
    if((pthread_create(&tid[i],NULL,thread_function,NULL))!=0)
    {
    printf("can't create pthread. ");
    exit(0);
    }
    i++;
    }
    for(i=0;i<5;i++)
    pthread_join(tid[i],NULL);

    sem_close(sem);
    sem_unlink(argv[1]);
    return 0;
    }

    void * thread_function(void *arg)
    {
    sem_wait(sem);
    print();
    sleep(1); //因为共享段执行过快,不能达到同步效果,所以需要睡眠
    sem_post(sem);

    printf("finish, pthread_id is%lu ",pthread_self());
    }

    void print()
    {
    int value;
    printf("pthread_id is %lu, get the resource ",pthread_self());
    sem_getvalue(sem,&value);
    printf("now,the semaphore value is %d ",value);
    }
    /*
    [root@linux Desktop]# gcc b.c -lpthread -lrt
    [root@linux Desktop]# ./a.out yy
    pthread_id is 3046529904, get the resource
    now,the semaphore value is 2
    pthread_id is 3036040048, get the resource
    now,the semaphore value is 1
    pthread_id is 3057019760, get the resource
    now,the semaphore value is 0
    finish, pthread_id is3046529904
    finish, pthread_id is3036040048
    finish, pthread_id is3057019760
    pthread_id is 3067509616, get the resource
    now,the semaphore value is 2
    pthread_id is 3077999472, get the resource
    now,the semaphore value is 1
    finish, pthread_id is3067509616
    finish, pthread_id is3077999472
    [root@linux Desktop]#

    */

  • 相关阅读:
    Kafka 消费者及消费者分区策略
    c++与c
    Exactly Once 语义
    如何在CentOS 8服务器上安装FreeIPA身份和授权解决方案?
    如何在Linux Mint 20上安装Wine
    如何在Ubuntu 20.04 LTS服务器上安装Wireguard
    如何在Ubuntu 20.04 LTS服务器上安装Apache JMeter
    如何在Linux服务器中使用SAR命令
    MongoDB是什么,它是如何工作的?
    如何在Ubuntu 20.04 LTS上安装SSH服务器
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4096059.html
Copyright © 2011-2022 走看看