我正在编写一个包含2个线程的多线程应用程序。 其中一个线程从队列接收数据并聚合它,另一个线程将聚合数据发送到服务器。
我希望能够知道上次收到数据的时间,所以我使用:
time_t last_data = time(NULL)
获取每个事件的正确时间(我不需要它超级准确,但我需要它快速)然后另一个用聚合数据发送此值。
我的问题是:
std::atomic<time_t>
进行了测试,似乎有一些性能问题,还有其他更快的方法吗?time(NULL)
(不必非常准确)?更新
以下是我的应用程序工作流程的说明。
申请需求: 1.使用IPC(目前为nanomsg)从外部来源获取数据。 2.将数据聚合到批量。 3.每隔给定间隔(1秒)将聚合数据发送到远程服务器。
目前的实施:
我不希望消费者在网络IO上等待,所以我创建了这个流程。 我可以在没有所有锁定的情况下使用事件驱动而不是这种复杂的机制(目前它工作正常,但我确定它可以更好)?
答案 0 :(得分:0)
答案 1 :(得分:0)
假设一个线程执行:
last_data = time(NULL);
另一个使用last_data
,但两者之间没有同步事件,那么当读取线程可以看到last_data
的修订值时,或者没有任何保证。
然而,最严重的可能性是time_t
(可能long
)的写入不是原子的,而另一个线程可以读取腐败的“部分写入”值。
这可能会导致延迟和时间计算中的故障,这可能会影响下游过程。
您可以分析您的程序并找到它,因为两者相互作用,在某些点上有足够的内存栅栏来保证最终更新。
注意:这是一个奇怪的情况,我怀疑你认为某些东西没有同步但它确实存在!通常的经验是另一种方式...
基本上没有足够的信息来了解你遇到的问题。 例如,如果读者线程是读取我希望看到的代码的唯一过程,那么:
主题1: 如果收到数据,锁定L,更新时间,添加到队列,解锁L. 线程2: 如果队列L中的项目,读取队列和更新时间,则解锁L ..过程项目。
在这种情况下,时间已经同步。
请提供最低限度,完整,可验证的示例......