计算多个线程同时调用的方法中任务的持续时间

Count the duration of a task inside a method called by multiple threads simultaneously

本文关键字:方法 任务 持续时间 调用 线程 计算      更新时间:2023-10-16

我创建了一个成员函数,它可以被多个线程同时调用。在这个函数中,我想计算函数执行的总持续时间。问题是,如果我创建4个线程,我返回的时间是实际时间的4倍!我怎样才能得到实际时间呢?我的方法是这样的:

void Class1::myTask() {
//...code
chrono::steady_clock::time_point start = chrono::steady_clock::now();
theFunction();
chrono::steady_clock::time_point end = chrono::steady_clock::now();
chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(end - start);
mytime = time_span.count();  // mytime is of atomic type
setTheTime(mytime); 
//...more code
} 
// The method to set the Total Time
void Class1::setTheTime(double mTime){
  time = time + mTime; // time is of atomic type
}

这个方法被调用了很多次,所以每次"end - start"返回大约0.000897442秒。总持续时间大约是11秒,但time的结束时间大约是44秒!

下面是一个代码示例,以便您可以看到问题:

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <thread>
#include <chrono>
#include <atomic>
using namespace std;
atomic<double> time1;
atomic<double> mytime;
void theFunction() {
    int x = 0;
    for (int i = 0; i < 10000000; ++i) {
        x++;
    }
}
double setTheTime(double mTime1) {
    time1 = time1 + mTime1;
}
void countTime() {
    chrono::steady_clock::time_point start = chrono::steady_clock::now();
    theFunction();
    chrono::steady_clock::time_point end = chrono::steady_clock::now();
    chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(end - start);
    mytime = time_span.count();
    setTheTime(mytime);
}
int main(int argc, char** argv) {
    vector<thread> threads;
    long double mt;
    chrono::steady_clock::time_point start = chrono::steady_clock::now();
    for (int i = 0; i < 4; i++)
        threads.push_back(thread(countTime));
    for (auto& thread : threads)
        thread.join();
    chrono::steady_clock::time_point end = chrono::steady_clock::now();
    chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(end - start);
    mt = time_span.count(); // mytime is of atomic type
    cout << "Time out of the function: " << mt * 1000 << endl;
    cout << "Time inside the function: " << time1 * 1000 << endl;
    return 0;
}

设N个线程,在X秒自然时间内并行运行。

所以在S时间内它们积累
S = N * X

大约持有。

44秒确实等于4 * 11秒。

那么问题是什么呢?:)