TCP服务端任务线程池

前面的文章中提到游戏服务器中存在很多的不同种类的线程,多个同类线程组成为线程池,不同的线程池组合在一起形成更大的线程池。

一种线程池可以抽象为以下的类结构:

class ThreadPool

{

 public:

    struct CallBack {

        virtual void exec(Thread* t) = 0;

        virtual ~CallBack(){}

    };

    typedef vector<Thread *> Cont;

    ThreadPool();

    ~ThreadPool();

    void add(Thread* t);

    Thread* get_by_index(const Cont::size_type i);

    Thread* operator[] (const Cont::size_type i);

    void join_all();

    void exec_all(CallBack &c) {

        for (auto it = co.being(); it != co.end(); ++it) {

            c.exec(*it);

        }

    }

    const Cont::size_type size() {

        return co.size();

    }

private:

    Cont co;

};

对于有各种不同种类的线程池"TCP服务端任务线程池"来说可以定义为如下类结构:

class TCPServerTaskPool: private Nocopy 

{

public:

    bool add_verify(TCPServerTask *);

    void add_sync(TCPServerTask *);

    void add_main(TCPServerTask *);

    void add_recycle(TCPServerTask *);

...

private:

    ThreadPool verify_pool;//验证线程池

    SyncThread *sync_thread; //同步线程

    ThreadPool main_pool;//主线程池

    RecycleThread *recycle_thread; //回收线程

...

};

class SyncThread : public Thread, public TCPServerTaskQue
{
public:
    ...
    virtual void run();
    
private:
    TCPServerTaskPool* pool;
    std::list<TCPServerTask* > tasks; //任务链表
    void add_task(TCPServerTask* task);
    void remove_task(TCPServerTask* task);
    ...
};

//和上面的SyncThread类似
class RecycleThread : public Thread, public TCPServerTaskQue
{
public:
    ...
    virtual void run();
    
private:
    TCPServerTaskPool* pool;
    std::list<TCPServerTask* > tasks; //任务链表
    void add_task(TCPServerTask* task);
    void remove_task(TCPServerTask* task);
    ...
};

//TCP服务端任务缓冲队列,TCPServerTask*放进该缓冲队列
class TCPServerTaskQue
{
public:
    void add_task(TCPServerTask* task);
    ...
private:
    std::queue<TCPServerTask*, std::deque<TCPServerTask*> > queue;
    ...
};

参考资料:

c++简单线程池实现 - 渣码农 - 博客园

使用C++11实现线程池的两种方法_Tattoo的博客-CSDN博客_c++11线程池

C++ 线程池实现原理_编程老师【学python加V:web7599】-CSDN博客

c++线程池_u010674648的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: QT的TCP通信使用线程池可以提高系统的并发性和响应性。通常情况下,使用单个线程来处理TCP通信可能会导致系统在处理大量连接时出现阻塞,影响系统的性能。 通过使用线程池,可以将TCP通信任务分配给多个线程来处理,从而使系统能够同时处理多个连接。线程池包含一组线程,这些线程在需要时可以立即执行任务。这样,可以确保每个连接都能获得足够的CPU时间,而不会被其他连接阻塞。 QT的线程池机制可以方便地管理线程的生命周期,分配和回收线程资源。当一个连接建立时,可以从线程池中获取一个线程来处理该连接,当连接终止时,可以将线程归还给线程池。这种方式可以避免不断创建和销毁线程的开销,提高系统的效率。 通过使用线程池,还可以实现线程的复用。当一个连接完成任务后,并不立即销毁线程,而是将线程放回线程池,以供下一个连接使用。这样可以避免线程的频繁创建和销毁,减少系统的开销,提高系统的性能。 总而言之,QT的TCP通信使用线程池可以提高系统的并发性和响应性,减少线程的创建和销毁开销,提高系统的性能和效率。 ### 回答2: 在Qt中,TCP通信可以使用线程池来实现。线程池是一种管理和调度多个线程的机制,可以有效地利用系统资源并提高程序的性能。 在使用Qt进行TCP通信时,我们可以使用Qt的QtConcurrent模块配合线程池来处理通信任务。QtConcurrent模块提供了一些方便的类和函数来进行并行编程,其中就包括了线程池。 首先,我们需要创建一个线程池对象,并指定线程池中的线程数量。可以根据需要来调整线程数量,以避免线程过多或过少造成的资源浪费或程序性能下降。 然后,我们可以使用QtConcurrent::run()函数来将需要执行的通信任务放入线程池中执行。该函数接受一个函数指针或lambda表达式作为参数,用于指定要执行的任务。同时,我们还可以通过该函数的返回值来获取任务的执行结果。 在通信任务中,我们可以使用Qt的QTcpSocket类来进行TCP通信操作。比如,可以使用QTcpSocket的connectToHost()函数来连接到服务器,使用write()函数来发送数据,使用read()函数来接收数据等等。 通过使用线程池,我们可以将通信任务分配给多个线程同时处理,提高了程序的并发性能。同时,线程池还可以根据系统资源的使用情况动态调整线程数量,以避免资源浪费和程序性能下降。 总之,通过在Qt中使用线程池来处理TCP通信,可以提高程序的性能和并发能力,同时还可以更好地利用系统资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值