Linux 【线程池】【单例模式】【读者写者问题】

在Linux环境下,使用线程池和单例模式来解决读者写者问题的示例代码如下:




#include <pthread.h>
#include <stdio.h>
 
// 线程安全的计数器
int counter = 0;
pthread_mutex_t counter_mutex = PTHREAD_MUTEX_INITIALIZER;
 
// 读写锁
pthread_rwlock_t rwlock;
 
// 初始化读写锁
void init_rwlock() {
    pthread_rwlock_init(&rwlock, NULL);
}
 
// 读者上锁
void read_lock() {
    pthread_rwlock_rdlock(&rwlock);
}
 
// 读者解锁
void read_unlock() {
    pthread_rwlock_unlock(&rwlock);
}
 
// 写者上锁
void write_lock() {
    pthread_rwlock_wrlock(&rwlock);
}
 
// 写者解锁
void write_unlock() {
    pthread_rwlock_unlock(&rwlock);
}
 
// 任务函数:写者任务
void writer_task() {
    write_lock();
    // 模拟写操作
    printf("Writer: Performing write operation...\n");
    sleep(1);  // 模拟耗时操作
    printf("Writer: Write operation completed.\n");
    write_unlock();
}
 
// 任务函数:读者任务
void reader_task() {
    read_lock();
    // 模拟读操作
    printf("Reader: Performing read operation...\n");
    sleep(1);  // 模拟耗时操作
    printf("Reader: Read operation completed.\n");
    read_unlock();
}
 
// 线程入口函数
void* thread_entry(void* arg) {
    int task_type = *(int*)arg;
    switch (task_type) {
        case 0:
            writer_task();
            break;
        case 1:
            reader_task();
            break;
    }
    return NULL;
}
 
// 线程池类
class ThreadPool {
public:
    ThreadPool(int size) {
        pool_size = size;
        threads = new pthread_t[pool_size];
        queue = new int[pool_size];  // 使用一个简单的队列模拟任务队列
        for (int i = 0; i < pool_size; ++i) {
            queue[i] = -1;  // 初始化任务队列为空
        }
    }
 
    ~ThreadPool() {
        delete[] threads;
        delete[] queue;
    }
 
    void start() {
        for (int i = 0; i < pool_size; ++i) {
            pthread_create(&threads[i], NULL, &thread_entry, &queue[i]);
        }
    }
 
    void add_task(int task_type) {
        for (int i = 0; i < pool_size; ++i) {
            if (queue[i] == -1) {
                queue[i] = task_type;
                break;
            }
        }
    }
 
private:
    int pool_size;
    pthread_t* threads;
    int* queue;
};
 
// 单例模式的线程池
class ThreadPoolSingleton {
public:
    static ThreadPoolSingleton& get_instance() {
        static ThreadPoolSingleton instance;
        return instance;
    }
 
    void start_pool() {
        pool.start();
    }
 
    void add_writer_task() {
        pool.add_
最后修改于:2024年08月23日 12:58

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日