首页 > 其他分享 >/* 线程读取循环队列*/

/* 线程读取循环队列*/

时间:2024-08-21 23:26:19浏览次数:10  
标签:读取 队列 void value queue int 线程 pthread CircularQueue

/* 线程读取循环队列*/

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

#define QUEUE_SIZE 5

typedef struct
{
    int data[QUEUE_SIZE];
    int front;
    int rear;
    pthread_mutex_t lock;
} CircularQueue;

void initQueue(CircularQueue *queue)
{
    queue->front = 0;
    queue->rear = 0;
    pthread_mutex_init(&queue->lock, NULL);
}

int isFull(CircularQueue *queue)
{
    return (queue->rear + 1) % QUEUE_SIZE == queue->front;
}

int isEmpty(CircularQueue *queue)
{
    return queue->front == queue->rear;
}

void enqueue(CircularQueue *queue, int value)
{
    if (!isFull(queue))
    {
        queue->data[queue->rear] = value;
        queue->rear = (queue->rear + 1) % QUEUE_SIZE;
        printf("Produced: %d\n", value);
    }
    else
    {
        printf("Queue is full!\n");
    }
}

int dequeue(CircularQueue *queue)
{
    if (!isEmpty(queue))
    {
        int value = queue->data[queue->front];
        queue->front = (queue->front + 1) % QUEUE_SIZE;
        return value;
    }
    else
    {
        return -1;
    }
}

void *producer(void *arg)
{
    CircularQueue *queue = (CircularQueue *)arg;
    while (1)
    {
        pthread_mutex_lock(&queue->lock);
        int value = rand() % 100 + 1;
        enqueue(queue, value);
        pthread_mutex_unlock(&queue->lock);
        usleep(100000);
    }
}

void *consumer(void *arg)
{
    CircularQueue *queue = (CircularQueue *)arg;
    while (1)
    {
        pthread_mutex_lock(&queue->lock);
        int value = dequeue(queue);
        pthread_mutex_unlock(&queue->lock);
        if (value != -1)
        {
            printf("Consumed: %d\n", value);
        }
        else
        {
            printf("Queue is empty!\n");
        }
        usleep(150000);
    }
}

int main(void)
{
    CircularQueue queue;
    initQueue(&queue);

    pthread_t producer_thread, consumer_thread1, consumer_thread2;
    pthread_create(&producer_thread, NULL, producer, (void *)&queue);
    pthread_create(&consumer_thread1, NULL, consumer, (void *)&queue);
    pthread_create(&consumer_thread2, NULL, consumer, (void *)&queue);
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread1, NULL);
    pthread_join(consumer_thread2, NULL);

    pthread_mutex_destroy(&queue.lock);
    return 0;
}

标签:读取,队列,void,value,queue,int,线程,pthread,CircularQueue
From: https://www.cnblogs.com/yesiming/p/18372745

相关文章

  • 多线程
    1多线程创建方式1.1继承Thread类,重写run()方法publicclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("Runninginthread:"+Thread.currentThread().getName());}publicstaticvoidmain(String[]args......
  • 昇腾 - AscendCL C++应用开发 线程安全的队列
    昇腾-AscendCLC++应用开发线程安全的队列flyfishC++mutex各种各样的互斥锁mutex、timed_mutex、recursive_mutex、shared_mutexC++线程间同步的条件变量std::condition_variable和std::condition_variable_anyC++提供的智能指针unique_ptr、shared_ptr、wea......
  • 操作系统线程介绍
    线程介绍什么是线程:线程是操作系统能内够进行运算、执行的最小单位,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。总结:线程是进程的一部分,是进程内负责执行的单位,进程是由资......
  • 线程与进程的区别(多进程与多线程)
    线程与进程的区别(多进程与多线程)资源:进程采用虚拟空间+用户态/内核态机制,所以就导致进程与进程之间是互相独立的,各自的资源不可见。在同一进程中的各个线程都可以共享该进程所拥有的资源。多进程之间资源是独立的,多线程之间资源是共享的。通信:由于进程之间是互相独立的,需......
  • 面试必备之线程池
    概述在Java中要想实现线程,有四种手段:继承Thread类实现java.lang.Runnable接口实现java.util.concurrent.Callable泛型接口,利用线程池线程池通过线程复用机制,并对线程进行统一管理,优点:降低系统资源消耗。通过复用已存在的线程,降低线程创建和销毁造成的消耗;提高响应速度......
  • java线程池任务执行过程 | java线程池原理探究 | 线程池源码
    目录一、线程池的使用二、线程池的创建2.1构造方法及参数2.2拒绝策略2.2.1AbortPolicy(直接抛出异常)2.2.2 CallerRunsPolicy(将任务交给调用者处理)2.2.3 DiscardOldestPolicy(弹出队列中等待最久的任务)2.2.4 DiscardPolicy(无操作)2.2.5自定义拒绝策略(实现Rejected......
  • Go Lang语言实现文件的写入、追加、读取、复制等操作
    /*Go语言的os包下有一个OpenFile函数,其原型如下所示:funcOpenFile(namestring,flagint,permFileMode)(file*File,errerror)其中name是文件的文件名,如果不是在当前路径下运行需要加上具体路径;flag是文件的处理参数,为int类型,根据系统的不同具体值可能有所不同......
  • Android开发 - Handler 类处理线程通信与任务调度解析
    什么是Handler类是处理线程间通信和任务调度的一个重要工具,用于在不同的线程之间传递消息和执行任务使用场景线程间通信:在子线程中执行任务后,更新主线程(UI线程)的界面。任务调度:安排在将来某个时间点执行的任务。基本工作原理消息队列:每个线程(包括主线程)都有一个......
  • 【2】Kaggle 医学影像数据读取
    赛题名称:RSNA2024LumbarSpineDegenerativeClassification中文:腰椎退行性病变分类kaggle官网赛题链接:https://www.kaggle.com/competitions/rsna-2024-lumbar-spine-degenerative-classification/overview文章安排①、如何用python读取dcm/dicom文件②、基于matplotlib......
  • 线程常用api
    线程常用apipthread_create该api用于创建一个新线程intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg)pthread_t*thread:指向线程标识符的指针,用于存储新创建的线程的线程标识符constpthread_attr_t*attr:用来......