我正在使用线程编写C ++程序以提高效率。
基本上我只是创建一个巨大的整数向量(1 GB)并用随机数填充它。我没有线程执行程序并计算了所需的时间。
现在我想使用2个线程并查看时间改进,但是程序花费的时间要多于2个线程而不是没有。不知道我做错了什么:S
#includes...
using namespace std;
//This function just make a for from first to final. Each iteration write a random
//number in the position i of the vector
void generateRandomVector(vector<int> &vec,int first, int final);
//Inside this function i take timestamp2 and calculate the executing time
void calculateTime(clock_t start);
int main(int argc, char *argv[]){
clock_t start;
double logaritmo;
int n = 256*1024*1024;
//Taking timestamp 1
start = clock();
vector<int> vec(n);
thread t1(generateRandomVector, ref(vec), 0, n/2);
thread t2(generateRandomVector, ref(vec), n/2, n);
t1.join();
t2.join();
calculateTime(start);
我通过引用传递给两个线程,因为我给它们不同的范围,所以它们永远不会访问相同的位置。
如果需要,我也可以发布generateRandomVector
功能。
希望有人可以提供帮助:D
编辑 - generateRandomVector
功能:
void generarRandomVector(vector<int> &vec,int first, int final){
srand((unsigned)time(0));
//PID of each thread
cout << "PID: " << this_thread::get_id() << "\n";
for(int i = first; i < final; i++){
vec[i] = static_cast<int> ((double)rand()*(double)(vec.size()) / ((double)RAND_MAX+1.0));
vec[i] = vec[i] % 10;
}
}
答案 0 :(得分:7)
这是完整的C ++ 0x解决方案,使用<random>
和<chrono>
:
#include <random>
#include <chrono>
#include <thread>
#include <iostream>
#include <vector>
#include <functional>
void generarRandomVector(std::vector<int> &vec, int first, int final)
{
std::mt19937_64 e(time(0));
std::uniform_int_distribution<> d(0, 9);
//PID of each thread
std::cout << "PID: " << std::this_thread::get_id() << "\n";
for(int i = first; i < final; i++)
vec[i] = d(e);
}
int main()
{
typedef std::chrono::high_resolution_clock Clock;
typedef std::chrono::duration<double> sec;
int n = 256*1024*1024;
Clock::time_point start = Clock::now();
std::vector<int> vec(n);
std::thread t1(generarRandomVector, std::ref(vec), 0, n/2);
std::thread t2(generarRandomVector, std::ref(vec), n/2, n);
t1.join();
t2.join();
Clock::time_point end = Clock::now();
std::cout << sec(end-start).count() << " seconds\n";
}
答案 1 :(得分:4)
不要使用rand()。
rand()使用全局状态生成下一个数字。网络上的一些来源[1]声称它是“线程安全的”,这意味着它可以使用锁,从而将所有调用序列化为rand()并消除所有并发性。
答案 2 :(得分:0)
上面给出的代码没有数据竞争的风险,但是在向量的两个部分中获得相同数据的风险很大。