【发布时间】: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 内移动锁。