gpt4 book ai didi

c - 与线程共享变量的最佳方式

转载 作者:行者123 更新时间:2023-11-30 18:37:23 25 4
gpt4 key购买 nike

除了主执行之外,我正在使用两个线程(pthread_t)的 mingw 程序。每个线程都包含一个无限循环,用于与外部仪器进行连续通信,每次通信具有不同的速度和协议(protocol)。主程序只是根据用户请求在运行时显示仪器数据。仅当 main 中的“keepalive”变量设置为 0 时,线程中的无限循环才会退出。为了在线程之间交换数据,我想知道我所知道的两种方式的优缺点:

  • 向线程传递参数(可以使用 pthread_create 的最后一个参数来传递结构:*arg)。

    int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
    void *(*start_routine) (void *), void *arg);
  • 使用全局变量并控制并发(pthread_mutex_lockpthread_mutex_unlock)

实际上我正在使用两种方式(主要是因为我需要一个早期的“工作程序版本”)。作为我引用的变量交换的示例:

  1. 我将“keepalive”变量定义为全局变量(以便在线程进入无限循环时共享它)。
  2. 我通过结构体传递通信配置数据。
  3. 我正在通过全局数组(在无限循环内更新)将仪器数据检索到 main
  4. 我正在检索文件句柄以及与结构的通信(最后,正确关闭并释放所有内容)。

我希望得到一些有关使用全局变量与使用原子变量结构的缺点的建议。 (代码整洁度、速度、效率、CPU/内存使用...)。

谢谢。

最佳答案

不应该使用全局变量几乎是普遍事实。(而且我认为您可能不理解 what extern is for 。)

然后...

[..] because I'm concerned about speed and efficiency.

您正在利用锁定来同步访问。因此,忘记它吧,由此产生的开销将掩盖其他任何事情。由于(链接时间)已知地址,使用全局可能可能会“更快”。不过,我严重怀疑这是否有任何意义。 不要在未咨询分析器的情况下过早优化。

全局变量的缺点是测试线程之间的通信变得更加困难。当传递struct时,您可以轻松启动另一个线程,并让该线程与您想要测试其通信的端点进行通信。您不需要为此更改任何端点,只需更改这些线程的启动方式即可。

此外,由于类似的原因,扩展应用程序并不容易。假设您有两个线程,例如一个“搜索器”(用于搜索某些数据)和一个“索引器”(负责存储匹配项,并可能分离进一步的操作)。如果它们通过全局变量进行通信,您将如何添加另一个搜索器线程?您必须使用另一个全局变量来进行新搜索器和索引器之间的通信,从而复制大部分搜索器线程(所有更改的只是用于通信的变量)。与传递包含“通信 channel ”的结构相比:在这里,您甚至不需要触摸搜索器代码,只需启动另一个代码即可。 (不过,必须更改索引器才能在两个示例中拥有多个输入源)。

最后,通过线程启动时的结构传递“通信 channel ”可以隐藏通信 channel ,从而限制哪些线程可以访问它。当试图找出谁在 channel 中写入/读取时,这可能非常有值(value)。 (“哪个线程写了那个狗屎?”)

关于c - 与线程共享变量的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37247460/

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