【问题标题】:Mutex lock and write to file互斥锁并写入文件
【发布时间】:2019-04-09 15:06:19
【问题描述】:

如果满足条件,我正在尝试将一些数据写入文件。 包含所有这些的函数被多个线程访问。

每次满足条件时,有四个变量分别写成“A、B、C、D”。经常发生的情况是,它写入的数据文件具有更多应该包含在一行中的变量。

通过gdb调试了一下,发现多个线程同时在写,这就是我引入pthread互斥锁的原因。

void Client::response(Sender* send, FILE *fp){
    pthread_mutex_lock(&lock);    

    if (status == ROI) {           

        if (condition) {
            RPS=serviceTime.size();
            double q90, q95, q99 = 0.0;
            std::sort(serviceTime.begin(), serviceTime.end());
            int q90 = (int)ceil(0.90 * double(RPS));
            int q95 = (int)ceil(0.95 * double(RPS));
            int q99 = (int)ceil(0.99 * double(RPS));
            q90 = serviceTime.at(Index90-1)/1e6;
            q95 = serviceTime.at(Index95-1)/1e6;
            q99 = serviceTime.at(Index99-1)/1e6;
            fprintf(fp, "%d, %.3f, %.3f, %.3f\n", RPS, q90, q95, q99);
            fflush(fp);
            serviceTime.clear();
        }
    }

    pthread_mutex_unlock(&lock);
}

我在这里缺少什么?为什么多次写入同一个文件?

【问题讨论】:

  • lock 在哪里定义? fp 除了这里用在哪里?我们需要一个 MCVE。
  • 高级别的。 FP 不在这里以外的任何地方使用。锁在 Client 类中定义。响应是一个公共函数。在 MCVE 上工作 - 将生成它
  • 查看pthread_mutex_lock的返回值?需要更多代码.. 我认为。
  • 线程使用多个Client类对象还是同一个对象?需要 MCVE。
  • 是有多个客户端对象还是只有一个客户端对象?如果有多个客户端,则可以将互斥锁设为静态对象,否则每个客户端都有自己的锁,但您需要互斥锁在单个锁上工作才能工作。此外,仅在满足条件时才考虑锁定,即在条件 if 内移动锁。

标签: c++ pthreads mutex


【解决方案1】:

我建议查看conditional vars,用于等待条件得到验证,或者查看scoped locks,将资源锁定在范围内,直到您退出所述范围。

【讨论】:

  • 这不能回答问题。根据 OP 问题的详细信息,这些事情都无济于事。
  • 多个线程正在写入同一个文件,我在函数顶部看到一个条件,它尖叫 cond vars ... 但是没关系
  • 嗯,这个问题非常模糊,我相信解决方案包含在我链接的概念中。但是,请成为我的客人,找一个更好的 :) 我认为对于任何并发写入共享资源,这些概念是关键。
  • 当然......但是当我们的问题含糊不清时,我们会评论并询问或更多细节,而不仅仅是非常含糊地回答。另外,OP 已经在使用互斥锁,这是确保独占访问的概念,而不是条件变量。另外他们正在使用 pthread,它不适用于您提供的链接,也许他们没有 c++11。
  • 我同意他们不一定使用 C++11(现在这很奇怪,但可以肯定)。对于您的评论,我根本没有看到它。是的,他们正在使用互斥锁,但它显然不起作用,因此对于上述等待满足条件以运行并发代码的问题,也许更合适/标准的方法是一个很好的指针。如果OP不同意,我相信他可以自己说:)
猜你喜欢
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多