• 信号量在线程中的应用


    1、多线程共享同一个进程的地址空间

    优点:线程间很容易进行通信, 通过全局变量实现数据共享和交换

    缺点:多个线程同时访问共享对象时,需要引入同步和互斥机制

    2、同步(synchronization)指的是多个任务(线程)按照约定的顺序相互配合完成一件事情

    (1)信号量代表某一类资源,其值表示系统中该资源的数量

    (2)信号量是一个受保护的变量,只能通过三种操作来访问

         * 初始化       sem_init

         * P操作(申请资源)    sem_wait

         * V操作(释放资源)    sem_post

    信号量的值为非负整数

       二值信号量:0 (资源不可用)     1(资源可用)

       计数信号量: 0 ~ n

    ![](信号量.png)

    1、sem_init: 初始化信号量

        #include

        int sem_init(sem_t *sem, int pshared, unsigned int value);

    参数: sem --- 初始化的信号量

        pshared --- 0(线程间使用)

        value --- 信号量的值

        返回值:成功: 0

        失败: -1, 设置errno

    2、sem_wait: p操作

            int sem_wait(sem_t *sem);

    返回值:成功: 0

        失败: -1, 设置errno

    3、sem_post:v操作

        int sem_post(sem_t *sem);

    返回值:成功: 0

    失败: -1, 设置errno

    代码如下:

    #include
    #include
    #include
    #include
    #include
    #include

    char buf[100];
    sem_t sem1; //生产者
    sem_t sem2; //消费者

    void *thread_func(void *arg)
    {
        while (1)
        {
            //p操作:申请资源
            sem_wait(&sem2);
            printf("buf: %s\n", buf);
            //v操作:释放资源
            sem_post(&sem1);
        }
    }

    int main(int argc, char *argv[])

        pthread_t thread;

        if (0 > sem_init(&sem1, 0, 1))
        {
            perror("sem_init1");
            return -1;
        }
        if (0 > sem_init(&sem2, 0, 0))
        {
            perror("sem_init2");
            return -1;
        }

        int err = pthread_create(&thread, NULL, thread_func, NULL);
        if (err != 0)
        {
            fprintf(stderr, "pthread_create: %s\n", strerror(err));
            return -1;
        }

        while (1) //生产者
        {
            //p操作:申请资源
            sem_wait(&sem1);
            printf("Input: ");
            fgets(buf, sizeof(buf), stdin);
            //v操作:释放资源
            sem_post(&sem2);
        }

        return 0;

     

  • 相关阅读:
    口袋参谋:99.99%商家都学的防骗技巧!
    python异步日志库loguru
    C#——文件读取Directory类详情
    Redis的基本使用
    微信小程序毕业设计题目学生公寓生活管理系统+后台管理系统|前后分离VUE.js
    OpenCV图像处理——数字图像处理基本操作
    css中flex和flex-grow的区别
    【网络安全】SSL Pinning及其绕过
    facebook跨境电商如何做
    【栈】736. Lisp 语法解析
  • 原文地址:https://blog.csdn.net/qq_63626307/article/details/126508338