pthread_create in c++

july

Erfahrenes Mitglied
Hallo zusammen,
ich möchte gern nach der Kommunikationsherstellung paar neue Threads bei meinem Programm starten
C++:
do{
	rc = listen(acceptSocket, 10);
	if (rc == SOCKET_ERROR)
	{
	cout << "Fehler: listen, fehler code:" << WSAGetLastError()
							<< endl;
					return 1;
				} else
				{
					cout << "acceptSocket ist im listen Modus...." << endl;
					sock = accept(acceptSocket, NULL, NULL);
					if (sock == INVALID_SOCKET)
					{
						cout << "Fehler: accept, fehler code: "
								<< WSAGetLastError() << endl;
						return 1;
					} else
					{
						cout << "Neue Verbindung wurde akzeptiert!" << endl;
						pthread_create(&p_thread, NULL, &receive_thread,(void*)&sock);
						Sleep(1);

					}
				}
			} while (1);

leider geht's mit pthread_create() nicht so einfach. Ich hab schon vieles mit dem Funbktionspointer ausprobiert und bin bei der Lösung stehen geblieben
C++:
extern "C" {
void *receive_thread(void *sock){
	char msg_buf[10000];
		Connection con;
		message_t msg;
		con.receive_message((SOCKET *)sock, msg_buf, &msg);
		cout << "server get message"<<endl;
		cout<< msg.clientId<<endl;

		//ueberprüfen ob die Meldung an dem richtigen Empfaenger gelandet ist

		switch(msg.nachArt)
		{
			case FEUER:

				break;
			case STOERUNG:
				break;
			case ABSCHALTUNG:
				break;
			case SONSTIGES:
				break;
			case RESET:
				break;
			case STATUS:

				break;
			case STATUSENDE:
				break;
			default:
				break;
		}
		return (0);
}
}
Das Problem an der Lösung ist, dass hier der Compiler zwar nicht meckert, aber das Programm stürzt sofort ab. Habt ihr vielleich eine Idee wier man das lösen kann?


Grüße July
 
Zuletzt bearbeitet von einem Moderator:
Wenn ich mich recht entsinne aus vorherigen Postings verwendest du ja aktiv Windows. Da kannst und solltest du eigentlich die Funktion CreateThread verwenden. Alternativ bietet sich auch die Möglichkeit an boost::thread in Betracht zu ziehen, da du da dann alles in einem hast.

In welcher Zeile stürzt dein Programm denn ab?
 
Hallo,

die Thread-Funktion ist schon ein Zeiger, den Adressoperator '&' solltest du nicht benötigen:
Code:
pthread_create(&p_thread, NULL, receive_thread,(void*)&sock);
Die Thread-Funktion als ' extern "C" ' zu deklarieren ist meines Erachtens auch nicht notwendig.

Gruß
MCoder
 
Bitte immer alle Fragen beantworten ;)

Die Frage würd ich gern beantworten, kann ich aber nicht, weil ich eclipse cdt mit MinGW benutze, unterstützt gdb leider Threads nicht bzw. kann ich nicht debuggen sobald da eine Threadfunktion vorkommt, in manchen Foren hab ich gelesen, dass es ein gdb-Bug ist...
 
Hi.
Die Frage würd ich gern beantworten, kann ich aber nicht, weil ich eclipse cdt mit MinGW benutze, unterstützt gdb leider Threads nicht bzw. kann ich nicht debuggen sobald da eine Threadfunktion vorkommt, in manchen Foren hab ich gelesen, dass es ein gdb-Bug ist...
Also ich hab damit keine Probleme. (\edit: mit GDB, Eclipse verwende ich nicht)

Poste doch bitte mal den vollständigen Code (als Anhang). Dann schau ich's mir mal an.

Gruß
 
Entwickelst du auf einer non-Windows Plattform?

Ansonsten (falls also gdb wirklich nicht funktionieren sollte) am besten halt pseudomässig Schritt für Schritt durch dein Programm gehen à la:
C++:
void waitOne() {
   std::cin.sync();
   std::cin.get();
}
...
waitOne();
// einen Programmschritt machen
waitOne();
// nächster Schritt
waitOne();
...
 
Ich hab jetzt das Problem gelöst, in dem ich gemacht hab, was mir Muepe32 geraten hat und CreateThread benutzt hab.
C++:
main(){
...
thread_attr_t *attr;
attr->zentralenId = zentralenId;
attr->socket = &sock;
h= CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)&receive_thread,(LPVOID)attr,0, NULL);
Sleep(1)
...
}

C++:
DWORD receive_thread(LPVOID attr){
...
thread_attr_t *tAttr = reinterpret_cast<thread_attr_t*>(attr);
SOCKET *sock = tAttr->socket;
...
 
Zuletzt bearbeitet von einem Moderator:
Ich hab jetzt das Problem gelöst, in dem ich gemacht hab, was mir Muepe32 geraten hat und CreateThread benutzt hab.
C++:
main(){
...
thread_attr_t *attr;
attr->zentralenId = zentralenId;
attr->socket = &sock;
h= CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)&receive_thread,(LPVOID)attr,0, NULL);
Sleep(1)
...
}
Du solltest da auf keinen Fall den Funktionszeiger casten müssen. Im Fall von CreateThread mußt du die WINAPI Aufrufkonvention verwenden. Siehe http://msdn.microsoft.com/en-us/library/ms686736(VS.85).aspx

Gruß
 
Zuletzt bearbeitet von einem Moderator:
Zurück