首页 » 日记 » 多线程编程

原文来自陈硕的多线程服务器的常用编程模型。温习。

线程的概念约在1993年后流行,最早支持多线程编程的通用OS是Solaris 2.2和Windows NT 3.1(发布于1993年)。1995年POSIX Thread标准发布。线程的特点包括:

  • 共享地址空间。同一个进程内的线程,共享进程地址空间。
  • 发挥SMP的性能。即发挥多核性能。

据称Alan Cox说A computer is a state machine. Threads are for people who can't program state machine(计算机是一台状态机,线程是给那些不能编写状态机的人准备的。

Reactor模式 - 非阻塞IO + IO多路转接(select/epoll)。Reactor模式的实现如:libevent/libev、ACE、Java NIO、POE(Perl)、Twisted(Python)。

Proactor模式- boost::asio、Windows I/O完成端口(Completion Ports)。

常见线程模型:

  • 为每个请求创建1线程或线程池,使用阻塞IO。
  • 非阻塞IO + IO多路转接 + 每个I/O线程有一个Reactor(事件循环)。

线程池的方案。以下我稍作修改原文代码:

工作线程伪代码:

void worker(void) {
    while(yes) {
        request = queue.pop();  // 如果没有元素可取,则阻塞
        handle request
    }
}

初始化线程池:

const int nthread = N;
for(int i = 0; i < nthread; ++i) {
    create_thread(&worker);
}

这里queue队列的实现是关键。可用std::deque作为底层容器,以消费者-生产者模式实现(mutex+条件变量)。

PIPE是单向的,且需要父子进程关系。

mutex - 使用RAII封装mutex,创建、销毁、加解锁都自动完成,一切交由Guard对象负责,Guard与临界区同寿。Guard对象是栈上对象,看函数调用可以分析锁的使用情况。

PTHREAD_MUTEX_ERRORCHECK排错。gdb打印各线程的调用栈thread apply all bt

Linux Pthread mutex使用futex实现,不必每次加解锁陷入系统调用。Windows的CRITICAL_SECTION类似。

分享

0