C++ Variable an boost::thread übergeben

an01662

Cadet 2nd Year
Registriert
Feb. 2013
Beiträge
22
Hallo,

ich bin Programmieranfänger und beschäftige mich zur Zeit etwas mit threads. Ich möchte an einen thread eine Variable übergeben, aber es will einfach nicht funktionieren. Hat jemand eine Idee. Oder sehe ich blos den Wald vor lauter Bäumen nicht. Das Beispiel stammt in schon abgewandelter Form von highscore.de

Code:
#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds)
{
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

void thread()
{
  std::cout << "Die Zahl war : " << x;

  for (int i = 0; i < 5; ++i)
  {
    wait(1);
    std::cout << i << std::endl;
  }
}

int main()
{
  std::cout << "Bitte Zahl eingeben : ";
  int x;
  std::cin >> x;

  boost::thread t(thread);
  t.join();
}
 
Ich kenn mich jez zwar nicht mit c++ threads aus, aber:
void thread()
Du übergibst ja keine Parameter!?
Und die Variable x ist auch nicht global.
Von daher kann er die Variable x in thread() gar nicht kennen.
 
Richtig genau so ist es. Aber die Frage ist, wie beomme ich die Variable da hin. Denn einfach die Variable über die Klammern() zu übergeben funktioniert nicht.
 
Hab zwar keinen Plan von C++, aber es sollte wohl
void thread(int x)
sein
 
indem du dem thread-constructor keine Funktion als Argument uebergibst, sondern einen functor, der die entsprechende Variable speichert und operator() definiert, welcher die eigentliche Funktionsimplementierung darstellt:

[Code aus dem stehgreif getippselt und nicht getestet; simple typos bitte selber fixen]

Code:
struct myThread
{
  myThread(int Arg) : x(Arg) {}

  void operator()()
  {
      std::cout << "Die Zahl war : " << x;
 
      for (int i = 0; i < 5; ++i)
      {
        wait(1);
        std::cout << i << std::endl;
       }
  }

  int x;
};

...

boost::thread t( my_thread(10) );
t.join();
 
Bringt leider keinen Erfolg.

In constructor 'myThread::myThread(int)':|
error: class 'myThread' does not have any field named 'x'|
In member function 'void myThread::operator()()':|
error: 'x' was not declared in this scope|
 
Hancock schrieb:
Dann pack das "int x;" über den Konstruktor.

Das sollte eigentlich Wurst sein. So lange x als Membervariable überhaupt deklariert ist, ist es völlig egal, ob das ober-oder unterhalb des Konstrktors erfolgt. Er muß irgend einen anderen Fehler gemacht haben. @OP: bitte mal deinen Code posten.
 
Hier wie gewünscht der Code.

Code:
#include <boost/thread.hpp>
#include <iostream>

void wait(int seconds)
{
  boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}

struct myThread
{
myThread(int Arg) : x(Arg) {}

void operator()()
{
std::cout << "Die Zahl war : " << x;
for (int i = 0; i < 5; ++i)
{
wait(1);
std::cout << i << std::endl;
}
}
};

int main()
{
  std::cout << "Bitte Zahl eingeben : ";
  int x;
  std::cin >> x;

  boost::thread t(myThread(x));
  t.join();
}
 
an01662 schrieb:
Hier wie gewünscht der Code.

Code:
// Im Moment nicht relevante Code-Abschnitte von antred entfernt:
struct myThread
{
	myThread(int Arg) : x(Arg) {}
	 
	void operator()()
	{
		std::cout << "Die Zahl war : " << x;
		for (int i = 0; i < 5; ++i)
		{
			wait(1);
			std::cout << i << std::endl;
		}
	}
};

Ok, du Nase. :p Jetzt schau dir dieses struct noch mal GENAU an, und frage dich, ob du nicht irgend was vergessen hast. x soll eine Membervariable des structs sein, nicht wahr ...?
 
Anstelle der zusätzlichen Struktur kann man auch einfach mit boost::bind ein Funktor-Objekt erzeugen und x an die Funktion binden:

Code:
#include <boost/thread.hpp>
#include <iostream>

#include <boost/bind.hpp>
 
void wait(int seconds)
{
    boost::this_thread::sleep(boost::posix_time::seconds(seconds));
}
 
void thread(int x)
{
    std::cout << "Die Zahl war : " << x << std::endl;
     
    for (int i = 0; i < 5; ++i)
    {
        wait(1);
        std::cout << i << std::endl;
    }
}
 
int main()
{
    std::cout << "Bitte Zahl eingeben : ";
    int x;
    std::cin >> x;
     
    boost::thread t(boost::bind(thread, x));
    t.join();
}
boost::bind liefert also eine Funktion ohne Argumente zurück, die eigentliche Funktion thread(int x) wird aber mit x als Parameter aufgerufen.

In C++11 ist boost::bind übrigens in die Standardbibliothek gewandert.
 
Danke für die Lösung mit boost::bind. Das ist genau das, wonach ich gesucht habe.
 
Zurück
Oben