多线程一读一写time_t



我正在编写一个有 2 个线程的多线程应用程序。 其中一个线程从队列接收数据并聚合数据,另一个线程将聚合数据发送到服务器。

我希望能够知道上次收到数据的时间,所以我使用:

time_t last_data = time(NULL)

在每个事件上获取正确的时间(我不需要它超级准确,但我需要它很快(,然后另一个发送此值与聚合数据。

我的问题是:

  1. 即使这对于我获得最新更新不是很重要,我是否必须同步它?
  2. 我用std::atomic<time_t>测试了它,它似乎有一些性能问题,还有其他更快的方法吗?
  3. 如果我不同步读/写,可能发生的最坏情况是什么?
  4. 有没有更快的方法来获取当前时间,然后time(NULL)(不必超级准确(?

更新

以下是我的应用程序工作流程的说明。

应用需求: 1. 使用 IPC(目前为 nanomsg(使用来自外部来源的数据。 2. 将数据聚合为批量。 3. 每隔给定间隔(1 秒(将聚合数据发送到远程服务器。

当前实现:

  1. 创建 2 个缓冲区来保存聚合数据(一个用于接收,一个用于发送(。
  2. 创建一个使用者线程以使用来自 IPC 的数据并填充接收缓冲区。
  3. 创建将数据发送到服务器的发送线程。
  4. 每次迭代间隔,发送线程将交换缓冲区(交换指针和使用互斥锁锁定(并将数据发送到服务器。

我不希望使用者等待网络 IO,所以我创建了这个流。 我可以在这里使用事件驱动而不是这种没有所有锁定的复杂机制吗(目前它工作正常,但我相信它可以更好(?

不要那样做。您只需要一个线程。您可以使用选择/轮询/电子轮询。这些可以等待您的输入,同时等待您的输出完成。您将进行事件驱动的编程和非阻塞输出。这是值得学习的东西。一开始有点困难,但很快就让生活更轻松,即没有你现在遇到的问题。程序也会更快。

假设一个线程执行:

last_data = time(NULL);

另一个使用last_data但两者之间没有同步事件,则无法保证last_data的修订值何时或是否对读取线程可见。

然而,最严重的可能是time_t(可能是long(的写入不是原子的,另一个线程可以读取损坏的"部分写入"值。 这可能会导致延迟和时间计算出现故障,从而可能影响下游流程。

您可能会分析您的程序,并发现由于两者相互作用,因此在某些时候有足够的内存围栏来保证最终更新。

注意:这是一个奇怪的情况,我怀疑你认为某些东西没有同步,但事实确实如此!通常的经验是相反的...

基本上没有足够的信息来了解您遇到的问题。 例如,如果读取器线程是读取时间的唯一进程,我希望看到如下代码:

线程 1: 如果收到数据,则锁定L,更新时间,添加到队列,解锁L。 线程 2: 如果队列 L 中的项目,读取队列并更新时间,解锁 L.。流程项。

在这种情况下,时间将已经同步。

请提供一个最低限度的、完整的、可验证的例子...

最新更新