C 语言中的 Go 风格通道

问题描述 投票:0回答:2

对于 C 语言的实时 DSP 程序,我需要类似 Go 风格的通道来在线程之间进行通信:

  • 一个线程在通道上推送代币
  • 另一个线程从通道中提取代币
  • 通道有缓冲区
  • 就我而言,令牌的内存占用很小(小数字向量)

我想知道使用好的旧流是否是一个好主意。如果没有,是否有好的实践和/或库来获得尽可能接近 Go 通道的东西?

c multithreading go signal-processing
2个回答
1
投票

您所描述的内容描述了一个线程安全的队列

Apache 项目有一个实现

除此之外,很多用户实际上已经分享了他们的

pthread
队列实现,假设这就是您正在使用的。


0
投票

Go 同时支持缓冲和无缓冲通道;无缓冲通道实际上对应于两个线程之间的“会合点”,它允许线程直接交换数据,即不需要额外的缓冲区;线程会合可以实现,例如有屏障(参见例如 https://en.wikipedia.org/wiki/Barrier_(computer_science))。您的小型固定大小令牌似乎非常适合无缓冲方法。

相比之下,缓冲通道可以实现为线程安全队列,正如已经提到的。在 FreeRTOS 中,您可以使用 xQueueCreate 创建这样一个队列。

我最近实现了一个 C 库,它支持基于 Pthreads 的缓冲和无缓冲 Go 通道的语义(请参阅 https://github.com/rochus-keller/CspChan)。您没有提供有关您的实施环境的信息。不过,将该库移植到 FreeRTOS(或类似的低级操作系统)看起来是可行的。

© www.soinside.com 2019 - 2024. All rights reserved.