c-如何避免多线程



我遇到了这个问题,这个答案给我留下了深刻的印象。

我真的很想听从这个答案的建议,但我无法想象如何做到这一点如何避免多线程

通常情况下,需要同时处理不同的事情(例如,不同的硬件资源或网络),但同时需要访问共享数据(如配置、要处理的数据等)。在不使用任何类型的大型状态机或事件循环的情况下,如何单线程解决这一问题?

我知道,这是一个巨大的话题,在Stackoverflow这样的平台上无法作为一个整体来回答。我想我真的应该去读上面提到的答案中的建议书,但现在我很想在这里读一些意见。

也许值得注意的是,我对C语言的解决方案感兴趣。Java、C++等高级语言,尤其是Qt或类似的框架,简化了很多,但纯C语言呢?

我们非常感谢您的任何意见。提前感谢大家

您已经提到了事件循环,但我仍然认为这些循环为许多应用程序提供了一个极好的多线程替代方案,并且在以后添加多线程时也可以作为一个很好的基础(如果需要的话)。

假设您有一个应用程序需要处理用户输入、套接字上接收的数据、计时器事件和信号,例如:

  • 一种多线程设计是生成不同的线程来等待不同的事件源,并在事件到达时使它们在某个全局状态上同步操作。这通常会导致混乱的同步和终止逻辑。

  • 单线程设计将具有一个统一的事件循环,该循环接收所有类型的事件,并在事件到达时在同一线程中处理它们。在*nix系统上,这可以使用例如select(2)poll(2)epoll(7)(后者特定于Linux)来实现。最近的Linux版本还提供了signalfd(2)timerfdtimerfd_create(2))和eventfd(2),用于将其他事件类型干净地适配到此模型中,并且在其他unice上,您可以使用各种技巧,例如pipe(2)来发出事件信号。libevent是一个很好的库,它可以将大部分内容抽象出来,它也可以在其他平台上工作。

除了不必立即处理多线程外,如果出于性能或其他原因需要,事件循环方法还可以在以后添加多线程:您只需让事件处理程序为某些事件生成线程。将所有事件处理都放在一个位置通常会大大简化应用程序设计。

当您确实需要多个线程(或进程)时,在它们之间使用狭窄且经过良好测试的接口会有所帮助,例如使用同步队列。事件处理程序的另一种设计是让事件生成线程将事件推送到事件队列,然后事件处理程序从中读取并调度事件。这样可以清晰地分离程序的各个部分。

阅读有关延续和延续传递样式(以及CPS转换)的更多信息。

CPS转换可能是"模拟"多线程的一种系统方式。

您可以了解CPC(Juliusz Chroboczek和Gabriel Kerneis的Continuation Passing C),它也是一个源到源C转换器。你也可以阅读老Appel的书:用续篇编译和Queinnec的书小片段Lisp

阅读更多关于事件循环、回调、闭包、调用堆栈、尾部调用的信息。这些想法与你的担忧有关。

另请参阅(几乎过时的)setcontext(3)Linux函数,以及事件循环中的空闲函数,请参阅。

您可以使用协程来实现并发任务。然后,您必须显式地将控制(cpu)传递给另一个协同程序。在一个小的延迟之后,中断不会自动完成。

http://en.wikipedia.org/wiki/Coroutine

最新更新