2021-01-13

该博客主要展示了C++中线程与线程池的实现代码。定义了CThread类用于线程操作,包含线程的创建、启动、加入等方法;还定义了CThraedPool类实现线程池,有启动、停止、添加任务等功能,通过互斥锁和条件变量进行线程同步。

#pragma once
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>

class CThread
{
public:
    typedef void(*threadFun_t)(void* arg);
    void EXIT_ERROR(const char* msg);
    CThread(const threadFun_t& threadRoutine, void* arg);
    void start();
    void join();
    ~CThread();
    static void* threadGuide(void* arg);
    pthread_t getThreadId(void);
private:
    bool m_isRunning;                           //该线程是否运行
    pthread_t m_threadId;                       //线程ID
    threadFun_t m_threadRoutine;                //线程入口函数
    void* m_threadArg;                          //线程入口函数参数
};

#include "CPthread.h"
#include <iostream>

using namespace std;

void CThread::EXIT_ERROR(const char* msg)
{
    perror(msg);
    exit(-1);
}

CThread::CThread(const threadFun_t& threadRoutine, void* arg)
{
    m_isRunning = false;
    m_threadId = 0;
    m_threadRoutine = threadRoutine;
    m_threadArg = arg;
}

void CThread::start()
{
    pthread_attr_t attr;
    if (!pthread_attr_init(&attr)) {
        //设置线程的继承:新的线程继承策略和参数来自于schedpolicy和schedparam属性中显式设置的调度信息!
        if ((!pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED))) {
            //设置线程的调度策略:其他调度策略(轮转法,先进先出)
            if (!pthread_attr_setschedpolicy(&attr, SCHED_OTHER)) {
                //设置线程的作用域:系统级调用(进程内竞争调用)
                if (!pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM)) {}
                else {
                    EXIT_ERROR("set thread scope failed");
                }
            }
            else {
                EXIT_ERROR("set thread policy failed");
            }
        }
        else {
            EXIT_ERROR("set thread herit failed");
        }
    }
    else {
        EXIT_ERROR("attr init failed");
    }

    if ((!pthread_create(&m_threadId, &attr, threadGuide, this))) {}
    else {
        EXIT_ERROR("thread create failed");
    }
    m_isRunning = true;
}

void CThread::join()
{
    if (m_isRunning) {
        if (!pthread_join(m_threadId, NULL)) {}
        else {
            perror("pthread join failed");
        }
    }
    m_isRunning = false;
}

CThread::~CThread()
{
    //如果线程正在执行,则分离此线程.为回收资源
    if (m_isRunning) {
        if (!pthread_detach(m_threadId)) {}
        else {
            EXIT_ERROR("thread detach failed");
        }
    }
}

void* CThread::threadGuide(void* arg)
{
    CThread* p = static_cast<CThread*>(arg);
    p->m_threadRoutine(p->m_threadArg);
    return NULL;
}

pthread_t CThread::getThreadId(void)
{
    return m_threadId;
}

 

#include "CThreadPool.h"
#include <sys/types.h>
#include <signal.h>

CThraedPool::CThraedPool(size_t tasksSize, size_t threadsSize)
{
    m_tasksSize = tasksSize;
    m_threadsSize = threadsSize;
    m_waitCount = threadsSize;
    m_threadsMax = MAX_THREADNUM;
    m_isQuit = false;
    pthread_mutex_init(&m_mutex, NULL);
    pthread_cond_init(&m_cond, NULL);
    //signal(SIGINT, CThraedPool::pthreadfun);
}

void CThraedPool::start()
{
    m_isQuit = false;
    m_threads.reserve(m_threadsSize);
    for (size_t i = 0; i < m_threadsSize; i++)
    {
        m_threads.push_back(new CThread(threadRoutine, (void*)this));
        m_threads[i]->start();                         //开始创建线程
    }
}

void CThraedPool::stop()
{
    pthread_mutex_lock(&m_mutex);
    m_isQuit = true;
    pthread_cond_broadcast(&m_cond);//子线程有可能在忙,有可能在等

    for (int i = m_threadsSize - 1; i >= 0; i--)
    {
        m_threads[i]->join();
        delete(m_threads[i]);
        m_threads.pop_back();
    }
    pthread_mutex_destroy(&m_mutex);
    pthread_cond_destroy(&m_cond);
    pthread_mutex_lock(&m_mutex);
    printf("threadpool quiting...\n");
}

void CThraedPool::addTask(Task task)
{
    //一请求一线程
    cout << "add a task......" << endl;
    if (m_threadsSize < m_threadsMax && m_waitCount == 0)
    {
        pthread_mutex_lock(&m_mutex);
        m_threads.push_back(new CThread(threadRoutine, (void*)this));
        m_tasksqueue.push(task);
        pthread_mutex_unlock(&m_mutex);
        m_threads[m_threads.size() - 1]->start();
        m_threadsSize++;
    }
    else
    {
        pthread_mutex_lock(&m_mutex);
        m_tasksqueue.push(task);
        pthread_mutex_unlock(&m_mutex);
    }

    m_tasksSize++;
    pthread_cond_signal(&m_cond);
}

int CThraedPool::getTaskCount()
{
    return this->m_workqueue.size();
}

void CThraedPool::pthreadfun(int no)
{
    cout << "%%%%%%%%%" << no << endl;
}

CThraedPool::~CThraedPool()
{
    if (!m_isQuit)
    {
        stop();
    }
}

void  CThraedPool::threadRoutine(void* arg)
{
    CThraedPool* p = static_cast<CThraedPool*>(arg);
    while (!(p->m_isQuit))
    {
        Task task = p->take();
        if (task)
        {
            task();
            pthread_mutex_lock(&(p->m_mutex));
            p->m_workqueue.erase(pthread_self());         //从工作队列中删除
            p->m_tasksSize--;
            pthread_mutex_unlock(&(p->m_mutex));
        }
    }
    pthread_mutex_lock(&(p->m_mutex));
    p->m_threadsSize--;
    pthread_mutex_unlock(&(p->m_mutex));
    if (p->m_threadsSize == 0)
    {
        pthread_cond_signal(&p->m_cond);
    }
    printf("a thread quiting...\n");
    return;
}

Task CThraedPool::take()
{
    if (m_tasksqueue.empty() && !m_isQuit)                                   //任务队列为空,一直睡眠
    {
        pthread_mutex_lock(&m_mutex);
        m_waitCount++;
        //cout << "waiting......" << endl;
        pthread_cond_wait(&m_cond, &m_mutex);
        m_waitCount--;
        //cout << "wakeup......" << endl;
        pthread_mutex_unlock(&m_mutex);
    }
    else if (!m_tasksqueue.empty() && !m_isQuit)
    {
        Task task = m_tasksqueue.front();
        pthread_mutex_lock(&(m_mutex));
        m_tasksqueue.pop();
        m_workqueue.insert(pair<pthread_t, Task>(pthread_self(), task));   //移入工作队列
        pthread_mutex_unlock(&m_mutex);
        return task;
    }
    return NULL;
}


 

 

训练数据保存为deep_convnet_params.pkl,UI使用wxPython编写。卷积神经网络(CNN)是一种专门针对图像、视频等结构化数据设计的深度学习模型,在计算机视觉、语音识别、自然语言处理等多个领域有广泛应用。其核心设计理念源于对生物视觉系统的模拟,主要特点包括局部感知、权重共享、多层级抽象以及空间不变性。 **1. 局部感知与卷积操作** 卷积层是CNN的基本构建块,使用一组可学习的滤波器对输入图像进行扫描。每个滤波器在图像上滑动,以局部区域内的像素值与滤波器权重进行逐元素乘法后求和,生成输出值。这一过程能够捕获图像中的边缘、纹理等局部特征。 **2. 权重共享** 同一滤波器在整个输入图像上保持相同的权重。这显著减少了模型参数数量,增强了泛化能力,并体现了对图像平移不变性的内在假设。 **3. 池化操作** 池化层通常紧随卷积层之后,用于降低数据维度并引入空间不变性。常见方法有最大池化和平均池化,它们可以减少模型对微小位置变化的敏感度,同时保留重要特征。 **4. 多层级抽象** CNN通常包含多个卷积和池化层堆叠在一起。随着网络深度增加,每一层逐渐提取更复杂、更抽象的特征,从底层识别边缘、角点,到高层识别整个对象或场景,使得CNN能够从原始像素数据中自动学习到丰富的表示。 **5. 激活函数与正则化** CNN中使用非线性激活函数来引入非线性表达能力。为防止过拟合,常采用正则化技术,如L2正则化和Dropout,以增强模型的泛化性能。 **6. 应用场景** CNN在诸多领域展现出强大应用价值,包括图像分类、目标检测、语义分割、人脸识别、图像生成、医学影像分析以及自然语言处理等任务。 **7. 发展与演变** CNN的概念起源于20世纪80年代,其影响力在硬件加速和大规模数据集出现后真正显现。经典模型如LeNet-5用于手写数字识别,而AlexNet、VGG、GoogLeNet、ResNet等现代架构推动了CNN技术的快速发展。如今,CNN已成为深度学习图像处理领域的基石,并持续创新。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值