美文网首页
线程安全之条件变量

线程安全之条件变量

作者: 二进制人类 | 来源:发表于2022-10-06 11:12 被阅读0次

相关API

初始化

#include <pthread.h>
/**
 * [pthread_cond_init 初始化条件变量]
 * @param  cond [初始化的条件变量指针]
 * @param  attr [要初始化条件变量的属性,使用NULL表示采用默认属性]
 * @return      [成功返回0,失败返回错误号]
 */
int pthread_cond_init(pthread_cond_t *restrict cond,
           const pthread_condattr_t *restrict attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

销毁

#include <pthread.h>
/**
 * [pthread_cond_destroy 销毁条件变量]
 * @param  cond [指向需要销毁的条件变量指针]
 * @return      [成功返回0,失败返回错误号]
 */
int pthread_cond_destroy(pthread_cond_t *cond);

等待条件

#include <pthread.h>
/**
 * [pthread_cond_wait 
 * 等待一个条件变量
    1) 阻塞等待条件变量cond满足;
    2) 释放已掌握的互斥锁(解锁互斥量)相当于pthread_mutex_unlock(&mutex);
        1) 2) 两步为一个原子操作。
    3) 当被唤醒,pthread_cond_wait函数返回时,解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);
 * ]
 * @param  cond  [已经初始化的条件变量]
 * @param  mutex [表示互斥锁]
 * @return       [成功返回0,失败返回错误号]
 */
int pthread_cond_wait(pthread_cond_t *restrict cond,
           pthread_mutex_t *restrict mutex);

/*
限时等待,在时间范围内等价于pthread_cond_wait,超过时间范围直接返回。
abstime绝对时间
 */
int pthread_cond_timedwait(pthread_cond_t *restrict cond,
           pthread_mutex_t *restrict mutex,
           const struct timespec *restrict abstime);

唤醒

#include <pthread.h>
/*
功能:唤醒至少一个阻塞在条件变量上的线程
参数:cond已初始化的条件变量
返回值:成功返回0,失败返回错误号
*/
int pthread_cond_signal(pthread_cond_t *cond);
/*
功能:唤醒所有阻塞在条件变量上的线程 
*/
int pthread_cond_broadcast(pthread_cond_t *cond);

实例

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

pthread_mutex_t mutex;      /* 定义互斥锁变量 */
pthread_cond_t cond;        /* 定义条件变量 */
char buf[] = "0123456789";

/* 定义数组元素输出子线程执行函数 */
void * prt_arr(void *arg)
{
    while(1) {
        /* 加锁 */
        pthread_mutex_lock(&mutex);
        /* 设置等待条件 */
        pthread_cond_wait(&cond, &mutex);   
        printf("%s\n", buf);
        /* 解锁 */
        pthread_mutex_unlock(&mutex);
        //sleep(1);
    }
}

/* 定义数组元素倒序子线程执行函数 */
void *reverse_arr(void *arg)
{
    int i;
    char tmp;
    while(1) {
        /* 加锁 */
        pthread_mutex_lock(&mutex);
        for (i = 0; i < 5; i++) {
            tmp = buf[i];
            buf[i] = buf[9-i];
            buf[9-i] = tmp;
        }
        /* 唤醒阻塞在cond条件下的线程 */
        pthread_cond_signal(&cond);
        /* 解锁 */
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }
}

int main()
{
    int ret;
    pthread_t prt_id;
    pthread_t reverse_id;
    /* 初始化互斥锁 */
    pthread_mutex_init(&mutex, NULL);
    /* 初始化添加变量 */
    pthread_cond_init(&cond, NULL);
    /* 生产者线程:倒序 */
    ret = pthread_create(&reverse_id, NULL, reverse_arr, NULL);
    if (ret != 0) {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    /* 消费者线程:输出数组元素 */
    ret = pthread_create(&prt_id, NULL, prt_arr, NULL);
    if (ret != 0) {
        fprintf(stderr, "create video pthread fail\n");
        return -1;
    }
    while(1) {
        printf("main pthread\n");
        sleep(10);
    }
    /* 销毁添加变量 */
    pthread_cond_destroy(&cond);
    /* 销毁互斥锁 */
    pthread_mutex_destroy(&mutex);
}

相关文章

  • 线程安全之条件变量

    相关API 初始化 销毁 等待条件 唤醒 实例

  • POSIX线程

    单线程 线程安全 生产者消费者模式 条件变量

  • 线程同步之条件变量

    在多线程编程中,线程的同步是一个宏观的概念,其实其内部的实现包含两个部分:一是互斥,二是线程之间的相互依赖关系。就...

  • channel使用场景:条件变量(condition varia

    条件变量(condition variable)类型于 POSIX 接口中线程通知其他线程某个事件发生的条件变量,...

  • 线程安全和共享资源

    多线程同时安全地调用被称为线程安全。如果一段代码是线程安全的,那么它不包含任何竞争条件。竞争条件仅在多个线程更新共...

  • 2.1.2实例变量非线程安全

    2.1.2实例变量非线程安全 如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。 程序运行...

  • Java多线程学习二 synchronized

    前面讲过,线程共享变量是非线程安全的,synchronized关键字可使方法变为线程安全的方法 一、线程安全问题 ...

  • kotlin - 学习笔记

    变量 条件 循环 异常 null 空安全 类 接口 类扩展方法 with 变量 条件 循环 异常 null 空安全...

  • 58(5.3)

    53分钟。 线程和进程区别 Java的线程安全 什么是线程安全,如何保障。哪些变量是线程安全。 Java IO 分...

  • GCD线程详解

    1.线程安全出现条件:多个线程访问更改同一个变量 2.OC在定义属性时有nonatomic和atomic两种选择 ...

网友评论

      本文标题:线程安全之条件变量

      本文链接:https://www.haomeiwen.com/subject/ezeuartx.html