S
So, hab die Ausgabe nun soweit hinbekommen.
Durch meine Recherchen stieß ich in der englischen Wikipedia auf folgenden Codeschnipsel:
#include <omp.h>
#include <iostream>
int main (int argc, char *argv[]) {
int th_id, nthreads;
#pragma omp parallel private(th_id)
{
th_id = omp_get_thread_num();
std::cout << "Hello World from thread " << th_id << std::endl;
#pragma omp barrier
#pragma omp master
{
nthreads = omp_get_num_threads();
std::cout << "There are " << nthreads << " threads" << std::endl;
}
}
return 0;
}
Auch dieses Prog funktioniert nicht. Ebenso "fehlerhafte" Ausgabe und da wird bereits eine Barriere angewandt. Warum das nicht funktionieren kann, liegt nach wie vor auf der Hand (Threadsicherheit != iostreams).
Da Frage ich mich nur, ob dieser Code bei Demjenigen funktioniert hat, als er den bei Wiki postete???
Also hab ich mich etwas weiter belesen und das ganze mit einer kritischen Zone gelöst:
Mein Prog (korrigiert) "helloworld6.cpp":
#ifdef _OPENMP
#include <omp.h>
#endif
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
#pragma omp parallel
{
#pragma omp critical
{
cout << "Hello World, says thread " << omp_get_thread_num()+1 << " of " << omp_get_num_threads()
<< ".\n";
}
#pragma omp barrier
}
getchar();
return 0;
}
@SeppJ: Ich glaube, Du meintest mit Locks bestimmt das mit "Simple lLocks" oder?
Das wär auch ne Lösung, muss ich mich aber noch weiter belesen. Inwieweit unterscheiden sich denn der Einsatz einer kritischen Zone (#pragma omp critical) und der Einsatz von Locks? Kommt da nicht das selbe heraus?
--------------------------------------------
Dann hättsch mal noch ne Frage. Die Barriere (#pragma omp barrier) aus meiner nun funktionierenden Version, rührt nur daher, weil ich mich zunächst daran gesetzt habe, die EN-Wikipedia-Version zu korrigieren. Ich habs dann auch glei bei EN-Wiki korrigiert:
#include <omp.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int th_id, nthreads;
#pragma omp parallel private(th_id) shared(nthreads)
{
th_id = omp_get_thread_num();
#pragma omp critical
{
cout << "Hello World from thread " << th_id << '\n';
}
#pragma omp barrier
#pragma omp master
{
nthreads = omp_get_num_threads();
cout << "There are " << nthreads << " threads" << '\n';
}
}
getchar();
return 0;
}
Meine Frage ist nun, ob die Barriere in meinem Programm noch einen logischen Sinn macht oder ob ich die wieder entfernen soll? Ob mit oder ohne Barriere, das Prog funktioniert in jedem Fall. :p
Ich weiß jetzt nicht, wie der Schrittbetrieb beim Einsatz einer kritischen Zone ausschaut. Grob betrachtet, müsste intern am Ende einer kritischen Zone bereits eine Barriere gesetzt sein, da ja nur jeweils ein Thread simultan diese kritische Zone ausführen soll und die anderen warten müssen.
Mein ursprünglicher Gedanke war ja, dass ich die Barriere-Extra am Ende belasse, falls dem nicht so ist und ich so die kritische Zone erstmal von allen Threads nacheinander ausführen lasse. Es wäre natürlich unnötiger Code mehr, wenn ich mit meiner Vermutung falsch liege.
THX nochmal.
Grüße
Schlitzauge