C++ 中的简单时间比较多线程程序(和 4 个问题)
Simple Time Comparison Multithreading Program in C++ (and 4 questions)
我有 C++ 经验,我正在尝试使用该语言学习多线程。
我刚刚编写了以下程序(问题下方的代码)来比较 运行 一个接一个地调用 10 个函数与并行调用的时间效率。
我的四个问题是:
线程库的使用是否正确?时间似乎是合理的,因为线程处理应该快得多,但我是这个功能的新手,想确定我做对了。如果程序有任何改进,请告诉我。
输出(代码下方)是否符合预期?线程试图同时打印到控制台,因此在新行之前写入了一些字符,或者使用其他值打印了一些字符,例如:3 + 5 = 84 + 5 = (new line) 9,而不是3 + 5 = 8(新行)4 + 5 = 9。这种行为是预期的吗?
此外,任何类型的阅读 material 或有关此主题的建议都将不胜感激!我一直在阅读文章并计划很快观看一些关于多线程的视频。
每次输出时间都不一样运行。当然这是预料之中的,但有时,多线程 运行 比一个接一个的函数调用 运行 慢。这应该发生吗?
#include <iostream>
#include <thread>
#include <time.h>
#include <chrono>
#include <ctime>
using namespace std;
void add(int num) {
cout << num << " + 5 = " << num + 5 << endl;
}
int main()
{
int a, b, c, d, e, f, g, h, i, j;
a = 0;
b = 1;
c = 2;
d = 3;
e = 4;
f = 5;
g = 6;
h = 7;
i = 8;
j = 9;
cout << "Starting timer for no multithreading" << endl;
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
add(a);
add(b);
add(c);
add(d);
add(e);
add(f);
add(g);
add(h);
add(i);
add(j);
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
cout << "Stopped timer for no multithreading" << endl;
std::chrono::duration<double> total1 = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
cout << "Without multithreading, the ten function calls took: " << total1.count() << " seconds to complete." << endl;
cout << endl << endl;
thread A(add, a);
thread B(add, b);
thread C(add, c);
thread D(add, d);
thread E(add, e);
thread F(add, f);
thread G(add, g);
thread H(add, h);
thread I(add, i);
thread J(add, j);
cout << "Starting timer for multithreading" << endl;
std::chrono::high_resolution_clock::time_point t3 = std::chrono::high_resolution_clock::now();
A.join();
B.join();
C.join();
D.join();
E.join();
F.join();
G.join();
H.join();
I.join();
J.join();
std::chrono::high_resolution_clock::time_point t4 = std::chrono::high_resolution_clock::now();
cout << "Stopped timer for multithreading" << endl;
std::chrono::duration<double> total2 = std::chrono::duration_cast<std::chrono::duration<double>>(t4 - t3);
cout << "With multithreading, the ten function calls took: " << total2.count() << " seconds to complete." << endl;
//cout << total2 << "seconds" << endl;
return 0;
}
输出为:
Starting timer for no multithreading
0 + 5 = 5
1 + 5 = 6
2 + 5 = 7
3 + 5 = 8
4 + 5 = 9
5 + 5 = 10
6 + 5 = 11
7 + 5 = 12
8 + 5 = 13
9 + 5 = 14
Stopped timer for no multithreading
Without multithreading, the ten function calls took: 0.0016732 seconds to complete.
0 + 5 = 5
1 + 5 = 6
2 + 5 = 7
3 + 5 = 84 + 5 =
9
5 + 5 = 106 + 5 = 11
7 + 5 =
12
8 + 5 = 13
Starting timer for multithreading9 + 5 = 14
Stopped timer for multithreading
With multithreading, the ten function calls took: 5.07e-05 seconds to complete.
提前谢谢你:D
这不是正确的时间测量方法。
thread A(add, a);
此处,将创建一个线程对象,它可能会立即执行函数(取决于 OS 调度程序)。
A.join();
在这里,您正在等待线程完成。
你的基本流程是
thread A(add, a);
start timer
A.join()
end timer.
因此,您的计时器测量的是等待线程完成所花费的时间 + 执行一些不幸的线程所花费的时间。
另一件事,std::cout 不是线程安全的。
我有 C++ 经验,我正在尝试使用该语言学习多线程。 我刚刚编写了以下程序(问题下方的代码)来比较 运行 一个接一个地调用 10 个函数与并行调用的时间效率。
我的四个问题是:
线程库的使用是否正确?时间似乎是合理的,因为线程处理应该快得多,但我是这个功能的新手,想确定我做对了。如果程序有任何改进,请告诉我。
输出(代码下方)是否符合预期?线程试图同时打印到控制台,因此在新行之前写入了一些字符,或者使用其他值打印了一些字符,例如:3 + 5 = 84 + 5 = (new line) 9,而不是3 + 5 = 8(新行)4 + 5 = 9。这种行为是预期的吗?
此外,任何类型的阅读 material 或有关此主题的建议都将不胜感激!我一直在阅读文章并计划很快观看一些关于多线程的视频。
每次输出时间都不一样运行。当然这是预料之中的,但有时,多线程 运行 比一个接一个的函数调用 运行 慢。这应该发生吗?
#include <iostream>
#include <thread>
#include <time.h>
#include <chrono>
#include <ctime>
using namespace std;
void add(int num) {
cout << num << " + 5 = " << num + 5 << endl;
}
int main()
{
int a, b, c, d, e, f, g, h, i, j;
a = 0;
b = 1;
c = 2;
d = 3;
e = 4;
f = 5;
g = 6;
h = 7;
i = 8;
j = 9;
cout << "Starting timer for no multithreading" << endl;
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
add(a);
add(b);
add(c);
add(d);
add(e);
add(f);
add(g);
add(h);
add(i);
add(j);
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
cout << "Stopped timer for no multithreading" << endl;
std::chrono::duration<double> total1 = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);
cout << "Without multithreading, the ten function calls took: " << total1.count() << " seconds to complete." << endl;
cout << endl << endl;
thread A(add, a);
thread B(add, b);
thread C(add, c);
thread D(add, d);
thread E(add, e);
thread F(add, f);
thread G(add, g);
thread H(add, h);
thread I(add, i);
thread J(add, j);
cout << "Starting timer for multithreading" << endl;
std::chrono::high_resolution_clock::time_point t3 = std::chrono::high_resolution_clock::now();
A.join();
B.join();
C.join();
D.join();
E.join();
F.join();
G.join();
H.join();
I.join();
J.join();
std::chrono::high_resolution_clock::time_point t4 = std::chrono::high_resolution_clock::now();
cout << "Stopped timer for multithreading" << endl;
std::chrono::duration<double> total2 = std::chrono::duration_cast<std::chrono::duration<double>>(t4 - t3);
cout << "With multithreading, the ten function calls took: " << total2.count() << " seconds to complete." << endl;
//cout << total2 << "seconds" << endl;
return 0;
}
输出为:
Starting timer for no multithreading
0 + 5 = 5
1 + 5 = 6
2 + 5 = 7
3 + 5 = 8
4 + 5 = 9
5 + 5 = 10
6 + 5 = 11
7 + 5 = 12
8 + 5 = 13
9 + 5 = 14
Stopped timer for no multithreading
Without multithreading, the ten function calls took: 0.0016732 seconds to complete.
0 + 5 = 5
1 + 5 = 6
2 + 5 = 7
3 + 5 = 84 + 5 =
9
5 + 5 = 106 + 5 = 11
7 + 5 =
12
8 + 5 = 13
Starting timer for multithreading9 + 5 = 14
Stopped timer for multithreading
With multithreading, the ten function calls took: 5.07e-05 seconds to complete.
提前谢谢你:D
这不是正确的时间测量方法。
thread A(add, a);
此处,将创建一个线程对象,它可能会立即执行函数(取决于 OS 调度程序)。
A.join();
在这里,您正在等待线程完成。
你的基本流程是
thread A(add, a);
start timer
A.join()
end timer.
因此,您的计时器测量的是等待线程完成所花费的时间 + 执行一些不幸的线程所花费的时间。
另一件事,std::cout 不是线程安全的。