EDIT: Question closed.
int mypow(int n) { return n * n; } transform(datos->origen->begin(),datos->origen->end(),datos->cuads->begin(),mypow);
我想獲得的總和,最小和戰俘在一個int載體的同時建議戰俘。 我正在使用Ubuntu 11.10,codelite和g ++與phtreads。
我填充矢量,併爲每個任務產生一個線程。但是我得到了錯誤的結果。
我認爲這個代碼沒問題,但真的沒有,我也不明白爲什麼。
充入10個整數的INT載體,我得到了以下執行:
Sum: 110 Min: 2 original container length:10 2 4 6 ... to 20 pow container lenght:20 0 0 0 ... 10 zeros 4 ----> true result after pow elements 16 36 64 ... rest of elements Main thread ended
在此先感謝
代碼:
#include <iostream>
#include <vector>
#include <pthread.h>
using std::cout;
using std::cin; // C++ uses
using std::endl;
using std::vector;
// struct to store results
typedef struct
{
int suma;
int min;
vector<int>* origen;
vector<int>* cuads;
}tdata;
// mutex
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
// Adition funct
void *suma(void* ptr)
{
// lock mutex
pthread_mutex_lock(&mutex1);
tdata* datos = reinterpret_cast<tdata*>(ptr);
// iterator
vector<int>::const_iterator it1 = datos->origen->begin();
while(it1 != datos->origen->end())
{
datos->suma += *it1;
it1++;
}
pthread_mutex_unlock(&mutex1);
return 0;
}
// minimun function
void* min(void *ptr)
{
pthread_mutex_lock(&mutex1);
tdata* datos = reinterpret_cast<tdata*>(ptr);
datos->min = datos->origen->at(0); // inicializo el menor
vector<int>::const_iterator it2 = datos->origen->begin();
while(it2 != datos->origen->end())
{
if ((*it2) < datos->min)
datos->min = (*it2);
it2++;
}
pthread_mutex_unlock(&mutex1);
return 0;
}
// pow function. Dinamically alloc vector and fill it
void* cuadrados(void* ptr)
{
pthread_mutex_lock(&mutex1);
tdata* datos = reinterpret_cast<tdata*>(ptr);
// Error int tan = static_cast<int>(datos->origen->size());
datos->cuads = new vector<int>(); // Error new vector<int>(tan);
vector<int>::const_iterator it3 = datos->origen->begin();
while(it3 != datos->origen->end())
{
int n = (*it3) * (*it3);
datos->cuads->push_back(n);
it3++;
}
pthread_mutex_unlock(&mutex1);
return 0;
}
int main(int argc, char **argv)
{
#define MAXHILOS 3 // nº de hilos
#define MAXNUMS 10 // cantidad de numeros
vector<int> enteros; // vector de enteros
pthread_t hilos[MAXHILOS]; // vector de hilos
// fill origin vector
for (int i = 0; i < MAXNUMS; i++)
enteros.push_back((i+1)*2);
// init target structure
tdata t = {0};
// point to origin vector
t.origen = &enteros;
// thread creation
pthread_create(&hilos[0],NULL,suma,&t);
pthread_create(&hilos[1],NULL,min,&t);
pthread_create(&hilos[2],NULL,cuadrados,&t);
// wait until all threads ends
pthread_join(hilos[0], NULL);
pthread_join(hilos[1], NULL);
pthread_join(hilos[2], NULL);
// show results
cout << "Sum: " << t.suma << endl
<< "Min: " << t.min << endl;
cout << "original vector length:" << enteros.size() << endl;
vector<int>::const_iterator ent = enteros.begin();
while(ent != enteros.end())
{
cout << (*ent) << endl;
ent++;
}
cout << "pow vector length:" << t.cuads->size() << endl;
vector<int>::const_iterator cuadr =t.cuads->begin();
while(cuadr != t.cuads->end())
{
cout << (*cuadr) << endl;
cuadr++;
}
//delete[] t.cuads;
cout << "Main thread ended" << endl;
cin.get();
return 0;
}
EDIT: Yes, the trouble was creating the vector with fixed size. Thanks to all.
有什麼問題造成的? – hmjd
@hmjd額外的零。此外,沒關係。 – ppk