C ++中的多线程事件处理

时间:2012-08-22 09:26:44

标签: c++ multithreading event-handling signals

当我们想要设计通用事件处理(I / O解复用)或反应器模式模型时。我们使用的底层系统调用是“select”或“poll”。但是这两个系统调用对于普通的FD都不是线程安全的。不能在多线程环境中使用。

在多个I / O中处理具有多个线程的事件的更好方法是什么。

我可以看到的方法是,主线程recv的任何事件并推入线程池的共享队列。但是工作线程无法通过I / O发送数据导致同步问题。还有内存溢出的缺点。

欢迎所有可能的建议。在此先感谢。

3 个答案:

答案 0 :(得分:1)

大多数Unix提供了更多可扩展的select / poll选择,可以在多线程环境中使用:

但是在多线程环境中正确使用它可能很棘手,因此您可能希望查看现有的抽象层,如boost.asio

另一方面,boost.asio确实引入了一些不可忽视的开销 - 我已经收集了一些关于它的信息以及http://nginetd.cmeerw.org

的epoll / kqueue的替代抽象

答案 1 :(得分:0)

一种方法是拥有一个输入线程,一个输出线程,几个工作线程和两个阻塞队列。

输入线程解析输入消息并将它们放入队列1.工作线程全部等待队列1,处理消息并将它们所有的输出放在队列2中。输出线程在队列2上等待并序列化它的输出。 / p>

InputThread:
    Loop:
        M = ReadNextMessage
        Q1.push(M)

AddOutput(O):
    Q2.push(O)

WorkerThread:
    Loop:
        M = Q1.pop
        ProcessMessage(M) using AddOutput as needed

OutputThread:
    Loop:
        O = Q2.pop
        WriteOutput(O)

但是我不知道你的意思是选择不是线程安全吗?所有系统调用在技术上都是线程安全的

这是一个非常古老的但仍然非常有趣的是一篇名为“CY10K问题”的文章,名叫凯格尔。

http://www.kegel.com/c10k.html

讨论在Linux上构建“multi io”程序的不同方法以及每种方法的优缺点。

答案 2 :(得分:0)

查看"Producer - Consumer problem",这是线程安全问题的一个非常好的起点。它还可以扩展到多个生产者和多个消费者。