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

时间:2014-07-02 16:56:54

标签: c++ c++11

我创建了一个由多个线程同时调用的成员函数。在这个函数里面,我想计算一个函数执行的总持续时间。问题是,如果我创建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
}

此方法被调用了很多次,因此每次“结束 - 开始”返回类似于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;
}

1 个答案:

答案 0 :(得分:0)

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

所以在时间S他们积累了 S = N * X

大致持有。

44s确实等于4 * 11s。

那么问题是什么? :)