【问题标题】:Making write buffer available for flushing by another thread使写缓冲区可用于另一个线程的刷新
【发布时间】:2021-02-04 21:42:08
【问题描述】:

我有一个场景,我想在 API 调用之后将数据写入磁盘。性能至关重要,因此我将每个线程的数据写入单独的每个线程文件。为了优化写入,我在内存中缓存数据,当缓冲区满或缓冲区中的数据老化时写入缓冲区。

问题是我不能让缓冲区中的数据老化太多。我只能在调用 API 函数时写入数据。如果 API 函数被调用一次并且我缓冲了数据,那么我必须等到再次调用 API 函数以确定数据是否过时或缓冲区已满,才能将其写入磁盘。这可能为时已晚,数据也太陈旧了。

我在想我可以有另一个线程定期检查缓冲区,如果数据老化太多,无论如何都会写出数据。我想以一种高性能的方式来做,不使用 pthread 条件和互斥锁,而是(理想情况下)原子等,我认为这会更快。我不确定完成这项工作所需的 GCC 内置函数。大多数关于内存栅栏的文档似乎都与指令顺序有关,而不是可见性。

【问题讨论】:

  • 您的问题是什么?您可能会问“尝试使用原子等是否明智”,或“我如何使用原子等”或其他内容。你测量过使用条件和互斥锁的性能吗?

标签: c multithreading gcc pthreads mutex


【解决方案1】:

我想以一种高效的方式来做,不使用 pthread 条件和互斥锁,而是(理想情况下)原子等,我认为这会更快。

你的信念是错误的。当发生争用时,原子等无法取消调度线程。互斥锁和条件可以。这样做不会有任何回报,而且可能会产生轻微的性能成本,而这比需要的复杂度更高。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-04-18
    • 2023-03-03
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多