多线程一读一写time_t
multithreaded one read one write time_t
我正在编写一个有 2 个线程的多线程应用程序。 其中一个线程从队列接收数据并聚合数据,另一个线程将聚合数据发送到服务器。
我希望能够知道上次收到数据的时间,所以我使用:
time_t last_data = time(NULL)
在每个事件上获取正确的时间(我不需要它超级准确,但我需要它很快(,然后另一个发送此值与聚合数据。
我的问题是:
- 即使这对于我获得最新更新不是很重要,我是否必须同步它?
- 我用
std::atomic<time_t>
测试了它,它似乎有一些性能问题,还有其他更快的方法吗? - 如果我不同步读/写,可能发生的最坏情况是什么?
- 有没有更快的方法来获取当前时间,然后
time(NULL)
(不必超级准确(?
更新
以下是我的应用程序工作流程的说明。
应用需求: 1. 使用 IPC(目前为 nanomsg(使用来自外部来源的数据。 2. 将数据聚合为批量。 3. 每隔给定间隔(1 秒(将聚合数据发送到远程服务器。
当前实现:
- 创建 2 个缓冲区来保存聚合数据(一个用于接收,一个用于发送(。
- 创建一个使用者线程以使用来自 IPC 的数据并填充接收缓冲区。
- 创建将数据发送到服务器的发送线程。
- 每次迭代间隔,发送线程将交换缓冲区(交换指针和使用互斥锁锁定(并将数据发送到服务器。
我不希望使用者等待网络 IO,所以我创建了这个流。 我可以在这里使用事件驱动而不是这种没有所有锁定的复杂机制吗(目前它工作正常,但我相信它可以更好(?
不要那样做。您只需要一个线程。您可以使用选择/轮询/电子轮询。这些可以等待您的输入,同时等待您的输出完成。您将进行事件驱动的编程和非阻塞输出。这是值得学习的东西。一开始有点困难,但很快就让生活更轻松,即没有你现在遇到的问题。程序也会更快。
假设一个线程执行:
last_data = time(NULL);
另一个使用last_data
但两者之间没有同步事件,则无法保证last_data
的修订值何时或是否对读取线程可见。
然而,最严重的可能是time_t
(可能是long
(的写入不是原子的,另一个线程可以读取损坏的"部分写入"值。 这可能会导致延迟和时间计算出现故障,从而可能影响下游流程。
您可能会分析您的程序,并发现由于两者相互作用,因此在某些时候有足够的内存围栏来保证最终更新。
注意:这是一个奇怪的情况,我怀疑你认为某些东西没有同步,但事实确实如此!通常的经验是相反的...
基本上没有足够的信息来了解您遇到的问题。 例如,如果读取器线程是读取时间的唯一进程,我希望看到如下代码:
线程 1: 如果收到数据,则锁定L,更新时间,添加到队列,解锁L。 线程 2: 如果队列 L 中的项目,读取队列并更新时间,解锁 L.。流程项。
在这种情况下,时间将已经同步。
请提供一个最低限度的、完整的、可验证的例子...
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误