标签归档:多线程

RSS feed of 多线程

最后更新于 .

最近看《python核心编程》,书中实现了一个简单的1对1的TCPserver,但是在实际使用中1对1的形势明显是不行的,所以研究了一下如何在server端通过启动不同的线程(进程)来实现每个链接一个线程。

其实python在类的设计上已经考虑到了这一方面的需求,我们只要在自己的server上继承一下SocketServer.BaseRequestHandler就可以了。
server端代码如下:

#!/usr/bin/env python
import SocketServer
from time import ctime
HOST = ''
PORT = 21567
ADDR = (HOST, PORT)
class MyRequestHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print '...connected from:', self.client_address
        while True:
            self.request.sendall('[%s] %s' % (ctime(),self.request.recv(1024)))
tcpServ = SocketServer.ThreadingTCPServer(ADDR ...

最后更新于 .

由于之前一个server用到后台线程的功能,所以写了一个线程+队列的通用模型。(代码见文章底的附件)

应用场景:当处理的数据不影响回包,即可以在后台执行。

使用方式:一个(或多个)线程向队列中塞数据,一个(或多个)线程从队列里取数据并执行。

已实现功能:

    1.统计功能。支持添加数据次数,添加溢出次数,执行次数,出错次数。

    2.写错误流水功能。当添加溢出,或执行出错,会打印错误流水号码,入队列时间,等等,格式可以自己控制。

    3.支持继承。可以自由重载想要实现的功能。

使用示例:

#include "thread_base.h"
class CChildThread:public CThreadBase
{
    protected:
        virtual int Process(StructSyncData * oneData,void* args)
        {
            //printf("%lld\n",oneData->ID ...

最后更新于 .

所有线程都有一个线程号,也就是Thread ID。其类型为pthread_t。通过调用pthread_self()函数可以获得自身的线程号。
下面说一下如何创建一个线程。
通过创建线程,线程将会执行一个线程函数,该线程格式必须按照下面来声明:

void * Thread_Function(void *)

创建线程的函数如下:

int pthread_create(pthread_t *restrict thread,
      const pthread_attr_t *restrict attr,
      void *(*start_routine)(void*), void *restrict arg);

下面说明一下各个参数的含义:

thread:所创建的线程号。
attr:所创建的线程属性,这个将在后面详细说明。
start_routine:即将运行的线程函数。
art:传递给线程函数的参数。


下面是一个简单的创建线程例子:

#include <pthread.h>
#include <stdio.h>
/* Prints x’s to stderr. The parameter is unused ...