我想在我的程序中创建一些线程,其中通过多个参数。我发现了这个示例,其中表明您可以避免结构并将多个参数传递给线程。有效。我以为。当我查看功能的持续时间时,它们花了相同的时间。
我正在亚马逊服务器上运行代码,因此我不确定服务器还是我的代码是否存在问题。
编辑我添加了可执行的代码,然后在本地计算机上运行它。它似乎没有表现出良好的结果。
#include <iostream>
#include <thread>
#include <future>
#include <unistd.h>
#include "time.h"
using namespace std;
void threadCallback(float &number)
{
sleep(10);
number = 10;
}
int main()
{
clock_t begin = clock();
for(int j = 0; j < 2; j++)
{
float fitness = 0;
threadCallback(fitness);
}
double duration = double(clock()-begin)/CLOCKS_PER_SEC;
std::cout << "Original duration ttt" << duration << endl;
clock_t begin1 = clock();
float fitness1 = 0;
std::thread th1(threadCallback, std::ref(fitness1));
float fitness2 = 0;
std::thread th2(threadCallback, std::ref(fitness2));
th1.join();
th2.join();
double duration1 = double(clock()-begin1)/CLOCKS_PER_SEC;
cout << "My duration ttt" << duration1 << endl;
return 0;
}
我很感谢我被卡住的任何指导。
我得到的持续时间分别为:0,000095和0,000297。
多线程不是免费的。每次产生线程时,都会有一些初始化开销。另外,拥有多个线程意味着操作系统需要管理它们,因此从一个线程转到另一个线程也不是免费的。
您的问题(又称每个线程上需要运行的代码(只是很小,以获得任何性能好处。作为一般的经验法则,我不建议尝试并行任何需要少数毫秒的代码,因为取决于您的操作系统,这可能是启动另一个线程所需的时间。
您遇到的第二个问题是使用clock()
。它考虑了运行程序所花费的时间,而不是自程序开始以来经过的时间。这是完全不同的,因为计算机永远不会一次运行单个程序。为了解决这个问题,我建议查看QueryPerformanceCounter
(仅是窗口(。某处可能还有其他功能更通用...
在本地计算机上运行代码,然后检查时间。并在Amazon服务器上运行相同的代码,然后再次检查时间。
通常在云上最初需要一些时间才能开始。但是,一旦执行至少一次,就不应再次花费更多时间。
通过多次执行线程功能来检查时间。