gpt4 book ai didi

c - 在线程之间共享通用数据

转载 作者:行者123 更新时间:2023-11-30 15:33:32 25 4
gpt4 key购买 nike

我需要为客户端服务器交互之类的东西创建一个库。数据请求并不频繁,大多只有几个字节(int、long)。对用户定义结构的请求很少。我看过一些类似的问题( thesethese ),但没有找到我在这里提出的问题的答案,因为我主要担心数据是通用的。

我遇到的设计问题是线程之间的数据共享:我的库有 2 个线程(pthreads),其中一个是消息处理程序(事件循环)。消息处理程序循环从服务器获取响应,并需要将数据传递给另一个线程。数据是通用的——可以是用户定义的结构、int 或 long。此外,同一类型的响应可能会被多次接收(每个响应都是唯一标识的),这意味着每个数据类型只有一个全局变量是行不通的。另一个线程正在等待条件变量,并将被消息处理程序线程唤醒。条件变量不是 bool 变量,而是检查消息处理程序是否已将请求的信息添加到某个“已知位置”。那么,如何实现线程间的这种数据共享呢?

我考虑了以下一些方法:

  1. 全局通用列表 - 带 void *data...处理程序线程在收到服务器响应后分配内存并向其他线程发出信号。第一个线程醒来并遍历列表寻找特定的 id。找到后,使用数据,然后释放内存。

    不需要定义不同的消息类型(例如 int、struct、long 等),但步行时间会相对较长。

  2. 全局列表数组 - 每种数据类型的列表头指针数组。分配和释放同上。除此之外,数组按数据类型(枚举)进行索引。

    步行相对较短,但需要为每个列表定义不同的 msg_types。

  3. 我还关心动态分配像 int 这样的小数据,这会导致碎片。因此尝试分配一个没有动态分配的数组,但在语义上没有成功。 (找不到足够复杂的例子)

    如果这是正确的方法,我会投入更多时间。 (一个例子会有所帮助!)

  4. 用于生成每种类型结构/消息的宏...只是认为这是一个过度杀戮(在示例中看起来非常复杂)

  5. 共享内存 - 使用 char * 缓冲区进行分配似乎太尴尬了..

在这种情况下最好的设计是什么?我希望这是可以理解的。

最佳答案

这是一个生产者-消费者场景,我的偏好是实现阻塞队列。

事件处理程序将消息推送到队列中。当队列为空时,工作线程会阻塞,当有需要处理的内容时,工作线程会被唤醒。

消息可以分配和释放,但如果从空闲列表中提取它们通常会更好。消息只是类型的 union ,具有共同的类型字段和 id。漂亮又简单。

扩展到多个工作线程和/或新消息类型非常简单。

您可以轻松找到用您选择的语言预先编写的此类阻塞队列的代码。

[您的约束条件可能不适合这种方法,但如果是这样,请编辑您的问题以使其清楚。]

<小时/>

C++ 中的可变长度阻塞队列有三种基本策略。假设一条消息是不同类型、不同大小的 union 体。

  1. 队列中的消息大小固定,并包含指向消息的指针。每条消息都会根据需要进行分配和释放。
  2. 队列中的消息大小固定,并包含指向消息的指针。消息保存在池(空闲列表/数组)中以避免分配开销。
  3. 队列中的消息大小是可变的。它们由插入队列的字节流组成,其长度可以知道要弹出多少内容。

通过搜索“阻塞队列可变长度 C++”或类似内容,您可以轻松找到示例代码和完整的工作示例。

关于c - 在线程之间共享通用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com