Frage von JutenMorgen, 81

std::thread invalid use of non-static member function?

Ich arbeite derzeit an einem Programm zum knacken einer RSA-verschlüsselten Nachricht. (Keine sorge, alles für die Uni :D) Wie dem auch sei, um die Laufzeit eines Prozesses zu verkürzen habe ich diesen in der Vergangenheit auf zwei threads aufgeteilt, was auch super funktioniert hat. Aus Gründen, die vollkommen uninteressant sind habe ich dies jedoch verworfen und wollte sie aber nun doch wieder haben... Bitte fragt nicht :D

Nun probiere ich schon die ganze Zeit meine Funktion "void calcPrimes(int modN)" in der Klasse "Decoder", in der Funktion "decode(blabla)" mit einem zusätzlichen thread aus zu führen. Hierzu sag ich einfach:

std::thread t1(calcPrimes, public_key_modN);  //neuer Thread
calcPrimes(public_key_modN); //main Thread
t1.join(); //t1 joint main

Sollte das ganze nicht so richtig sein? Wieso bekommen ich dann oben genannte Fehlermeldung? Wie gesagt ich hatte es schon einmal und es hat wunderbar funktioniert... Als Compiler verwende ich g++ unter Ubuntu mit den präfixen -std=c++11 und -pthread für die threads.

Ich hoffe mir kann hier jemand helfen es ist zwar nicht notwendig für die Hausübung aber mich ärgert es einfach, dass es nicht geht und das ohne ersichtlichen Fehler.

Liebe Grüße, JutenMorgen!

Antwort
von JutenMorgen, 37

Ich habe das ganze jetzt mal sehr vereinfacht. In der Funktion "decode(blabla)" steht nur noch dieser eine Befehl:

std::thread first(test);

die test gibt nur "TEST!" auf dem std::cout aus.

Beide Funktionen sind von der Klasse Decoder. Alles funktioniert, bis auf die eine Zeile um den Thread zu starten. Da compiled es nicht -.-

Mein MakeFile schaut folgendermassen aus:

CC = g++
CFLAGS += -g -Wall -std=c++11 -pthread
TARGET = rsa
SOURCES = main.cpp decoder.cpp encoder.cpp
NTL_LIBS = -lntl # -lgmp -lm

all:
$(CC) $(CFLAGS) -o $(TARGET) $(SOURCES) $(NTL_LIBS)

clean:
rm -f $(TARGET)

Ich hoffe wirklich mir kann jemand helfen. 

Liebe Grüße, JutenMorgen!

Antwort
von ByteJunkey, 50

Hi JutenMorgen,

1. Welche IDE benutzt du?

2. Hast du noch etwas verändert/hinzugefügt, bevor du den Code wieder abgeändert hast?

Kommentar von JutenMorgen ,

Hi ByteJunkey!

Ich verwende CodeBlocks unter Ubuntu, compile die Files aber über die Console->makefile->g++. Diese liegen nämlich ausserhalb des CB-Projekts. Ich verwende CB quasi nur als Editor.

Was meinst du genau mit verändert hinzugefügt?

Liebe Grüße!

Kommentar von ByteJunkey ,

Du hast ja geschrieben "[...]in der Vergangenheit auf zwei threads aufgeteilt, was auch super funktioniert hat. Aus Gründen, die vollkommen uninteressant sind habe ich dies jedoch verworfen und wollte sie aber nun doch wieder haben[...]"

Das heißt in meinen Augen, dass du etwas verändert hast, außer nur die Anzahl der Threads ;)

Kommentar von JutenMorgen ,

Anbei mal die calcPrimes-funktion. Diese funktioniert einwandfrei wenn ich sie einfach nur aufrufe. Nur der thread hat ein Problem damit... NTL ist nur eine lib für große Integer(ZZ) mit diversen zusätzlichen Operatoren.

void Decoder::calcPrimes(NTL::ZZ modN_)
{
NTL::ZZ p_l, q_l;
if(modN_%2 == 0)
{
q_l = 1;
p = 2;
q = modN_/2;
std::cout << "p is: " << p << std::endl;
std::cout << "q is: " << q << "\n" << std::endl;
return;
}
p_l = 3;
q_l = 0;
q = 0;
NTL::ZZ max_runs = NTL::SqrRoot(modN_) + 1;
NTL::ZZ index;
index = p_l+9999996;

while (p_l < max_runs)
{
if (modN_ % p_l == 0)
{
q_l = modN_ / p_l;
break;
}
p_l += 2;
if(p_l > index)
{
sharedCOut(1, p_l, max_runs);
index += 10000000;
}
}
std::cout << std::endl;
if (q_l == 0)
{
std::cout << "Error: No Prime Factors found!" << std::endl;
}
else
{
p = p_l;
q = q_l;
std::cout << "p is: " << p << std::endl;
std::cout << "q is: " << q << "\n" << std::endl;
}
}

Index und die if-abfrage p_l > index ist nur um mehr Leistung zu bekommen und nur alle 10000000 Schritte den Fortschritt aus zu geben. "sharedCOut" ist die Funktion zur Ausgabe des Fortschrittes in % mit einem mutex. hier wurde nichts verändert und das hat funktioniert. In der Funktion "calcPrimes" habe ich Kleinigkeiten, wie z.B. "NTL::ZZ max_runs = NTL::SqrRoot(modN_) + 1;" statt " NTL::ZZ max_runs = modN_/2;" verändert, aber nichts von dem ich denke, dass es ausschlaggebend wäre.

In der Funktion "decode(blabla)" steht mittlerweile nur der Code, den ich oben schon geschrieben habe. Den Rest habe ich aus Verzweiflung auskommentiert....

Ich hoffe wirklich, du kannst mir hier weiter helfen.

Falls es noch Fragen gibt immer her damit. Liebe Grüße!

Kommentar von JutenMorgen ,

P.s. Sorry wegen den Einrückungen. Das ist hier irgendwie echt ein wenig bescheuert auf GF.net

P.p.s mit verändert meinte ich größtenteils bzw. ausschlaggebend ganz andere Teile des Programms.

Kommentar von ByteJunkey ,

Puhhh da bin ich auch mit meinem Latein am Ende. ich kann dieses Forum weiterempfehlen. Dort wird man dir 100%-tig weiterhelfen können: https://www.spieleprogrammierer.de/

Tut mir leid, dass ich dir nicht sehr viel helfen konnte :(

Keine passende Antwort gefunden?

Fragen Sie die Community