多线程一读一写time_t

时间:2017-08-16 10:29:14

标签: c++ multithreading c++11

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

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

time_t last_data = time(NULL)

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

我的问题是:

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

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

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

    目前的实施:

    1. 创建2个缓冲区来保存聚合数据(一个用于接收,一个用于发送)。
    2. 创建一个消费者线程以使用来自IPC的数据并填充接收缓冲区。
    3. 创建一个将数据发送到服务器的发送线程。
    4. 发送线程将交换缓冲区(交换指针和使用互斥锁定)的间隔的每次迭代,并将数据发送到服务器。
    5. 我不希望消费者在网络IO上等待,所以我创建了这个流程。 我可以在没有所有锁定的情况下使用事件驱动而不是这种复杂的机制(目前它工作正常,但我确定它可以更好)?

2 个答案:

答案 0 :(得分:0)

不要这样做。你只需要一个线程。您可以使用select / poll / epoll。这些可以等待您的输入,同时输出完成。您将进行事件驱动编程和非阻塞输出。这是值得学习的东西。起初有点困难,但很快就会让生活变得更轻松,即没有你现在遇到的问题。该计划也会更快。

答案 1 :(得分:0)

假设一个线程执行:

last_data = time(NULL);

另一个使用last_data,但两者之间没有同步事件,那么当读取线程可以看到last_data的修订值时,或者没有任何保证。

然而,最严重的可能性是time_t(可能long)的写入不是原子的,而另一个线程可以读取腐败的“部分写入”值。 这可能会导致延迟和时间计算中的故障,这可能会影响下游过程。

您可以分析您的程序并找到它,因为两者相互作用,在某些点上有足够的内存栅栏来保证最终更新。

注意:这是一个奇怪的情况,我怀疑你认为某些东西没有同步但它确实存在!通常的经验是另一种方式...

基本上没有足够的信息来了解你遇到的问题。 例如,如果读者线程是读取我希望看到的代码的唯一过程,那么:

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

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

请提供最低限度,完整,可验证的示例......