专栏首页曾大稳的博客生产者消费者模型

生产者消费者模型

生产者消费者模型主要有以下函数和对象

//线程锁对象
pthread_mutex_t mutex;

//用于初始化pthread_mutex_t锁对象 
pthread_mutex_init(&mutex, NULL);

//用于销毁pthread_mutex_t锁对象
pthread_mutex_destroy(&mutex)

//线程条件对象
pthread_cond_t cond;
//用于初始化pthread_cond_t线程条件对象 
pthread_cond_init(&cond, NULL);
//用于销毁pthread_cond_t线程条件对象 
pthread_cond_destroy(&cond);

//用于上锁mutex,本线程上锁后的其他变量是不能
被别的线程操作
pthread_mutex_lock(&mutex);

//用于解锁mutex,解锁后的其他变量可以被其他线程操作
pthread_mutex_unlock(&mutex);

//用于发出条件信号
 pthread_cond_signal(&cond);

//用于线程阻塞等待,这个函数会解锁,直到pthread_cond_signal发出条件信号后才执行退出线程阻塞执行后面的操作
才执行退出线程阻塞执行后面的操作
pthread_cond_wait(&cond, &mutex);

示例代码如下:


#include "pthread.h"
#include "queue"
#include "unistd.h"

pthread_t produc;
pthread_t custom;
pthread_mutex_t mutex;
pthread_cond_t cond;

std::queue<int> queue;

void *producCallback(void *data)
{

    while (1)
    {
        pthread_mutex_lock(&mutex);

        queue.push(1);
        LOGD("生产者生产一个产品,通知消费者消费, 产品数量为 %d", queue.size());
        pthread_cond_signal(&cond);
        pthread_mutex_unlock(&mutex);
        sleep(5);
    }
    pthread_exit(&produc);

}

void *customCallback(void *data)
{
    while (1)
    {
        pthread_mutex_lock(&mutex);

        if(queue.size() > 0)
        {
            queue.pop();
            LOGD("消费者消费产品,产品数量还剩余 %d ", queue.size());
        } else{
            LOGD("没有产品可以消费, 等待中...");
            pthread_cond_wait(&cond, &mutex);
        }
        pthread_mutex_unlock(&mutex);
        usleep(500 * 1000);
    }
    pthread_exit(&custom);
    pthread_mutex_destroy(&mutex);
    pthread_cond_destroy(&cond);

}


extern "C"
JNIEXPORT void JNICALL
Java_com_zzw_jnithread_ThreadDemo_mutexThread(JNIEnv *env, jobject instance) {


    for(int i = 0; i < 10; i++)
    {
        queue.push(1);
    }
    pthread_mutex_init(&mutex, NULL);
    pthread_cond_init(&cond, NULL);

    pthread_create(&produc, NULL, producCallback, NULL);
    pthread_create(&custom, NULL, customCallback, NULL);

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • zygote篇

    参考连接:http://gityuan.com/2016/02/13/android-zygote/

    曾大稳
  • Android View的Touch事件分发

    事件分发的重要性我就不多说了,我们先从简到难。 先看View的Touch事件分发,我自定义一个View,重写OnTouchEvent函数,然后分别设置OnTou...

    曾大稳
  • ffmpeg android视频解码

    要解码,我们需要获取解码器AVCodec,解码器我们需要通过codec_id获取,codec_id我们需要通过AVStream获取,AVStream我们需要通过...

    曾大稳
  • 线程同步之条件变量(pthread_cond_wait)

    条件变量给了线程以无竞争的方式等待特定条件发生。条件变量是和互斥量一起使用的,条件变量是由互斥量保护的。这么讲,大家可能不明白,这条件变量有什么用?干什么的?还...

    zy010101
  • UNPv2第七章:互斥锁与条件变量

     pthread_mutex_lock()函数是一个阻塞型的上锁函数,若互斥锁已经上了锁,调用pthread_mutex_lock()函数对互斥锁再次上锁...

    提莫队长
  • 为什么说LockSupport是Java并发的基石?

    而AQS中的控制线程又是通过LockSupport类来实现的,因此可以说,LockSupport是Java并发基础组件中的基础组件。LockSupport定义了...

    luoxn28
  • Linux同步机制(一) - 线程锁

    1 互斥锁 在线程实际运行过程中,我们经常需要多个线程保持同步。 这时可以用互斥锁来完成任务。互斥锁的使用过程中,主要有 pthread_mutex_init ...

    三丰SanFeng
  • win32 pthread:获取线程 id

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648
  • Java锁的那些事儿

    Java多线程开发中,如果涉及到共享资源操作场景,那就必不可少要和Java锁打交道。

    有赞coder
  • 死锁问题分析的利器——valgrind的DRD和Helgrind

            在《DllMain中不当操作导致死锁问题的分析--死锁介绍》一文中,我们介绍了死锁产生的原因。一般来说,如果我们对线程同步技术掌握不牢,或者同步...

    方亮

扫码关注云+社区

领取腾讯云代金券