【发布时间】:2017-08-16 10:29:14
【问题描述】:
我正在编写一个有 2 个线程的多线程应用程序。 其中一个线程从队列中接收数据并将其聚合,另一个线程将聚合后的数据发送到服务器。
我希望能够知道上次收到数据的时间,所以我使用:
time_t last_data = time(NULL)
获取每个事件的正确时间(我不需要它非常准确,但我需要它快速),然后另一个发送这个值和聚合数据。
我的问题是:
- 即使获取最新更新不是很重要,我是否也必须进行同步?
- 我用
std::atomic<time_t>测试了一下,好像有一些性能问题,有没有其他更快的方法? - 如果我不同步读/写,最坏的情况是什么?
- 有没有比
time(NULL)更快的方法来获取当前时间(不必非常准确)?
更新
这是我的应用程序工作流程的解释。
应用需求: 1.使用IPC(目前nanomsg)从外部来源消费数据。 2. 将数据聚合成批量。 3. 每隔给定的时间间隔(1 秒)将聚合数据发送到远程服务器。
当前实现:
- 创建 2 个缓冲区来保存聚合数据(一个用于接收,一个用于发送)。
- 创建一个消费者线程来消费来自 IPC 的数据并填充接收缓冲区。
- 创建将数据发送到服务器的发送线程。
- 发送线程的每次迭代都会交换缓冲区(交换指针和使用互斥锁进行锁定)并将数据发送到服务器。
我不希望消费者在网络 IO 上等待,所以我创建了这个流程。 我可以在这里使用事件驱动来代替这种没有所有锁定的复杂机制吗(目前它工作正常,但我相信它会更好)?
【问题讨论】:
-
你为什么要做多线程?
-
因为我不想在发送到服务器时阻止队列中的消费
-
我是这么想的,请看下面的答案。
-
问题 1 和 3 无法回答:参见问题 1 中的“this”一词。“this”是什么?看起来您正在尝试同步两个线程,这是正确的。如果是这样,那么使用线程不是一个好主意。线程应该大部分独立,几乎没有同步。如果它们花费大量时间阻塞/同步,那么这表明它们应该是一个线程。
-
为什么使用 C 中的库函数而不是 C++。
std::chrono::steady_clock::now()呢?
标签: c++ multithreading c++11