Ich experimentieren Zeug und versuchen, die Zeit zum Erstellen von N Threads und einige einfache Operation im Thread zu berechnen.Benchmarking der Leistung von Threads
Ich habe eine Variable initialisiert auf 0
und warten bis es den Wert N erreicht, wobei N die Anzahl der Threads ist. Auf diese Weise kann ich sicherstellen, dass alle Threads mindestens bis zum Teil vor der return-Anweisung (letzte Zeile dieser Funktion) ausgeführt werden.
Ich vermute, dass Zahlen [0,N]
wo N is the number of threads we want to create
in einer zufälligen Reihenfolge ausgegeben werden sollte, aber Drucken einige Sachen, die nicht Sinn macht (Adressen, möglicherweise). Meine Frage ist, warum die Zahl nicht
-Code hier in zufälliger Weise von 0 bis N gedruckt werden:
void* increment(void *);
int main(int argc , char *argv[])
{
if(argc != 2) {
cout<<"Please provide the number of threads to create" <<endl;
return -1;
}
int nthreads = atoi(argv[1]);
pthread_t thread_ids[nthreads];
int count = 0;
struct timeval timeStart, timeEnd;
gettimeofday(&timeStart, NULL);
int i = 0;
while(i < nthreads)
{
pthread_t thread_id;
if(pthread_create(&thread_ids[i] , NULL , increment , (void*) &count) < 0)
{
error("could not create thread");
return 1;
}
++i;
}
while(count < nthreads)
{
cout<<"Waiting !"<<endl;
//repeat
}
gettimeofday(&timeEnd, NULL);
for(i = 0; i < nthreads; i++)
pthread_join(thread_ids[i], NULL);
std::cout << "This piece of code took "
<< ((timeEnd.tv_sec - timeStart.tv_sec) * 1000000L + timeEnd.tv_usec - timeStart.tv_usec) << " us to execute."
<< std::endl;
return 0;
}
void* increment(void *i)
{
int *p = (int*)i;
cout<<*p<<endl<<std::flush;
fflush(stdout);
*p = *p + 1;
return 0;
}
Nicht sicher, was ist falsch in diesem Stück Code. Irgendwelche Zeiger?
Was ist Ihre Frage? – immibis
Frage aktualisiert! – listen
Unsynchronisierter, nicht atomarer, nicht schreibgeschützter Zugriff auf ein gemeinsames Objekt in mehreren Threads ist ein nicht definiertes Verhalten. – EOF