threads synchro



  • hi leute!

    ich versuche gerade mit boost::threads mein glück;-) habe ne fragen...warum wird hier gib 10 gezählt? irgend etwas läuft hier schief...
    anders fällt mir nix ein, wie man ne schleifenbedingung schützen kann, ohne die ganze schleife zu locken.

    cu

    #include <boost/thread/mutex.hpp>
    #include <boost/thread/thread.hpp>
    #include <iostream>
    #include <windows.h>
    
    boost::mutex io_mutex;
    unsigned int counter=0;
    
    inline int readcounter()
    {
    	{
    	boost::mutex::scoped_lock
    		lock(io_mutex);
    	}
    
    	return counter;
    } 
    
    void thread1()
    {
      while(readcounter()<10)
      {
    	  {	 
          boost::mutex::scoped_lock
            lock(io_mutex);
    
    	  ++counter;
    
    	  std::cout << "Thread1: " << counter << std::endl;
    	  }
    	  Sleep(100);
       }
    }
    
    void thread2()
    {
      while(readcounter()<10)
      {
    	  {	  
          boost::mutex::scoped_lock
    		  lock(io_mutex);
    
    		  ++counter;
    
    	      std::cout << "Thread2: " << counter << std::endl;
    	  }
    	  Sleep(100);
        }
    }
    
    int main ()
    {
      boost::thread thrd1 ( &thread1 );
      boost::thread thrd2 ( &thread2  );
    
      while(readcounter()<10)
      {
    	  {	 
          boost::mutex::scoped_lock
            lock(io_mutex);
    
    	  ++counter;
    
    	  std::cout << "main thread: " << counter << std::endl;
    	  }
    	  Sleep(100);
       }
    
      thrd1.join();
      thrd2.join();
    
      std::cin.get();
    }
    

    ausgabe:
    ---------------------------
    Thread1: 1
    Thread2: 2
    main thread: 3
    Thread1: 4
    Thread2: 5
    main thread: 6
    Thread1: 7
    Thread2: 8
    main thread: 9
    Thread1: 10



  • Weil du den Zähler nach der Prüfung aber vor der Ausgabe erhöhst.
    Erhöhe ihn mal nach der Ausgabe.


Anmelden zum Antworten