Einfaches Beispiel für Prozessynchronisation mit Arrays



  • Hallo liebe Gemeinde,

    ich wollte fragen ob eine Möglichkeit existiert, so dass zwei verschiedene Methoden "abwechselnd" ein Array manipulieren können. Das heisst dass wenn eine Methode dasselbe Array manipuliert oder benutzt, ausgeschlossen wird dass die andere Methode dasselbe tut und umgekehrt.

    void printarray (int arg[], int length) {   
    
    for (int n=0; n<length; n++)     
    cout << arg[n] << " ";   
    cout << "\n"; }
    

    und

    void plusThree (int arg[]) {   
    
    for ( int i=0 ; i<arg.length() ; i++ )
      {
        arg[i] += 3;
      }
    }
    

    Wie kann man die Synchronisation für diese Methoden auf ein beliebiges Array realisieren?

    Lieben Dank im Voraus,

    Tanja



  • Klassisches Beispiel für std::mutex .

    Aber zum Thema Thread-safety ist noch viel mehr da. Grundlagenbuch? Vielleicht
    C++ Concurrency in Action | ISBN: 1933988770



  • Danke für deine Antwort Sone. Wie funktioniert denn das mutex? Hat man da nicht ein einfaches Beispiel, beispielsweise für unseren Fall mit dem Array?



  • tanja.hopfer schrieb:

    Hallo liebe Gemeinde

    Wie kommst du darauf, dass wir lieb sind 😮 ?

    Ich glaub, dir fehlen noch mehr Grundlagen, als nur der Mutex? Zumindest ist die Frage recht schwammig formuliert. Du redest von "Methoden", die ein Array manipulieren. Weißt du denn überhaupt schon, wie man mehrere Threads erstellt? Weil ohne brauchst du erstmal auch kein Mutex 😉



  • Mechanics 🙂 Wie erstellt man denn mehrere Threads? Was meinst du genau?



  • Wie erstellt man denn mehrere Threads? Was meinst du genau?

    Na wie erstellst du denn mehrere Objekte? 🤡

    Nein, aber mal im Ernst, das wird hier nix. Besorg dir ein Grundlagenbuch zu diesem Thema (oder nach dem zweiten Beispiel wohl eher ein Grundlagenbuch zu C++), und frag erst, wenn du was konkretes hast.



  • Naja, wenn du etwas "gleichzeitig" machen willst, brauchst du Threads. Wenn du C++11 benutzt, kannst du std::thread nehmen. Wird in dem von Sone vorgeschlagenen Buch wahrscheinlich alles drin stehen, ich kenns nicht. Es gibt aber auch genug Tutorials im Internet, um schnell reinzukommen brauchst du da nicht unbedingt ein Buch. z.B. erster Treffer bei Google:

    http://www.justsoftwaresolutions.co.uk/threading/multithreading-in-c++0x-part-2-function-objects-and-arguments.html



  • Ja, und guck mal welches Buch die da rechts werben 😉



  • Genau das was du vorgeschlagen hast Sone 😉 Danke nochmal 🙂 Wie sieht denn die Idee aus um das auf das Array-Beispiel anzuwenden?



  • ...



  • *klopfklopf* Hallo, darf ich kurz stören?
    Findet ihr das Buch empfehlenswert? Wollte auch mal eins im Schrank stehen haben. Nur damit ich meinen Gästen imponieren kann, selbstverständlich.



  • Ohne Threads ist das ganz einfach:

    class Method
    {
    public:
    	virtual void ArrayOperation(int a[], int length) = 0;
    };
    
    class PrintMethod : public Method
    {
    public:
    	virtual void ArrayOperation(int a[], int length)
    	{
    		for(int i = 0; i < length; ++i)
    			cout << a[i] << ", ";
    		cout << endl;
    	}
    };
    
    class CalcMethod : public Method
    {
    public:
    	virtual void ArrayOperation(int a[], int length)
    	{
    		for(int i = 0; i < length; ++i)
    			a[i] += 3;
    	}
    };
    
    int main()
    {
    	const int SIZE = 10;
    	int arr[SIZE];
    
    	bool condition = rand() % 2 == 0;
    
    	Method * m = condition ? new PrintMethod : new CalcMethod;
    
    	m->ArrayOperation(arr, SIZE);
    
    	delete m;
    
    	return 0;
    }
    

    (Um trotzdem mal ein Negativbeispiel zu nennen, da gibts genug Dinge anzumäkeln in dem Code)

    Aber ist es echt das was du willst?
    Oder geht es dir um echte Nebenläufigkeit wie alle hier vorrausgesetzt haben?



  • Ich habs ne zeitlang so gemacht (ist vielleicht unsauberer Code, wenigstens ein Vorschlag). Wollte z.B. die Anzahl aktiver Threads bestimmen und habe die Long's dann mit InterlockedIncrement() und InterlockedDecrement() inkrementiert und dekrementiert.


Log in to reply