【发布时间】:2023-03-25 17:22:01
【问题描述】:
我需要为诸如客户端服务器交互之类的东西创建一个库。数据请求并不频繁,而且大多只有几个字节(整数、长整数)。对用户定义结构的请求很少。我已经查看了一些类似的问题(these 和 these),但没有找到我在这里所问问题的答案,因为我主要担心数据是通用的。
我在设计中遇到的问题是线程之间的数据共享: 我的库有 2 个线程(pthreads),其中一个是 msg 处理程序(事件循环)。 msg 处理程序循环从服务器获取响应并需要将数据传递给另一个线程。数据是通用的 - 可以是用户定义的 struct 或 int 或 long。此外,可能会多次收到相同类型的响应(每个响应都是唯一标识的),这意味着每个数据类型的单个全局变量都不会这样做。另一个线程正在等待条件变量,并将被 msg 处理程序线程唤醒。条件变量不在布尔变量上,而是检查 msg 处理程序是否已将请求的信息添加到某个“已知位置”。那么,如何实现线程间的数据共享呢?
我考虑了以下一些方法:
-
全局通用列表 - 带有 void *data...处理程序线程在接收到服务器的响应时分配内存并向其他线程发出信号。第一个线程唤醒并遍历列表以寻找特定的 id。找到后,使用数据,然后释放内存。
无需定义不同的 msg 类型(用于 int、struct、long 等),但 walk 会比较长。
-
全局列表数组 - 每种数据类型的列表头指针数组。分配和免费同上。除了,数组是按数据类型(枚举)索引的。
walk 相对较短,但需要为每个列表定义不同的 msg_types。
-
我还关心动态分配像 int 这样会导致碎片的小数据。所以尝试分配一个没有动态分配的数组,但在语义上没有成功。 (找不到足够复杂的例子)
如果这是正确的方法,我会在这方面投入更多时间。 (举个例子会有所帮助!)
用于生成每个类型的 struct/msg 的宏...刚刚决定这是一个矫枉过正(在示例中看起来非常复杂)
共享内存 - 使用 char * 缓冲区进行分配似乎太尴尬了..
在这种情况下,最好的设计是什么。我希望这是可以理解的。
【问题讨论】:
-
您是否考虑过使用管道从“消息处理程序”线程到“其他”线程进行通信?
-
是的,但是根据我对管道的了解(仅基于 [beej.us/guide/bgipc/output/html/multipage/pipes.html] 并且没有实际经验),我认为它是将数据写入文件,这意味着我需要转换我的结构更基本的东西?另外,我上面没有提到的是第一个线程可能不止一个。即不止一个读者线程。不确定这对管道是否有影响。
-
管道允许您从一侧写入,然后从另一侧(fifo)读取。它最适合一位作家和一位读者。但是,有些实现类似于您的实现,每个(第一个线程)使用一个管道,(另一个)线程将监视和服务(即:读取)所有管道。
-
请注意,您的问题与设计相关,通常在 programmers.stackexchange.com 而不是 stackoverflow 上解决。
标签: c multithreading