【问题标题】:Using a dedicated thread for file output使用专用线程进行文件输出
【发布时间】:2026-01-31 19:10:01
【问题描述】:

我有一个模拟主题公园的多线程程序,并将日志消息写入给定的文本文件。我最初试图让每个线程都写入文件,但是我在线程访问文件指针时遇到了错误。

建议我使用专用线程进行写入,并以该特定线程随后将写入文件的所有其他方法写入缓冲区。显然我需要一个互斥锁来同步对缓冲区的访问,但是有没有办法在每次缓冲区写入之后首先向写入线程发出信号,以便它有机会在互斥锁被通知给每个尝试的方法之前将缓冲区写入文件写入缓冲区?

【问题讨论】:

  • 再读一遍那句话。您想在每次缓冲区写入 之后 向写入器线程发出信号,以便可以在 之前 任何其他人想要写入缓冲区...?
  • 您可能想要搜索有关条件变量的阅读。但是,我建议不要使用线程附加到的统一缓冲区,而是建议使用队列。处理队列比处理环绕缓冲区更容易。这也意味着您实际上不必使用任何信号,只需一个互斥体。
  • 顺便说一句,对于您的原始解决方案,您是否也使用了互斥锁?

标签: c multithreading file-io mutex


【解决方案1】:

我通过使用 2 个互斥体解决了我的问题。第一个在执行开始时被锁定。第二个在写入缓冲区时被锁定。写入完成后,第一个互斥锁被解锁,允许线程写入输出。一旦写入输出,它就会解锁第二个互斥锁,以便可以将其他内容写入缓冲区。

输出线程:

void *output_logging(void *path)
{
    while(END)
    {
        FILE *write = fopen(path, "w+");
        while(1)
        {
            pthread_mutex_lock(&tlock);
            fputs(BUFFER, write);
            pthread_mutex_unlock(&write_lock);
        }
    }
}

还有一个写的例子:

pthread_mutex_lock(&write_lock);
sprintf(BUFFER, "Beginning of Simulation\n");
pthread_mutex_unlock(&tlock);

【讨论】: