C pthread schlafen lassen ohne mutex machbar?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.107
Will ein Thread in Linux schlafen lassen. Mir geht es nur darum nach eine bestimmte zeit daten auszulesen. Es wird nichts geschrieben!
Hab gegooglet aber keine lösung gefunden.
hat da wer eine Idee?

danke
 
PThread-Mutexe sind sowieso nicht zum Warten gedacht, sondern zum Sperren. Zum Warten benutzt du am besten Condition Variables.
 
Das ist einfach: sleep(ms) im Thread aufrufen, nicht alles erfordert gleich eine CV oder ein Mutex - Handles sparen!
 
ne mit sleep sperre ich nicht den thread sondern den Prozess... Naja, keine ahnung genau, aber alle threads "schlafen" wenn ich sleep aufrufe!
 
roker002 schrieb:
ne mit sleep sperre ich nicht den thread sondern den Prozess... Naja, keine ahnung genau, aber alle threads "schlafen" wenn ich sleep aufrufe!

The sleep() function shall cause the calling thread to be suspended from execution until either the number of realtime seconds specified by the argument seconds has elapsed or a signal is delivered to the calling thread and its action is to invoke a signal-catching function or to terminate the process.

Quelle: http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

Soviel dann zum Thema...


Vielleicht lockst Du ein Mutex, was von allen Threads gebraucht wird und rufst dann sleep auf - dass dann alle Threads schlafen, ist klar...
 
Zuletzt bearbeitet:
na es ist schon multithreadfähig programmiert. wieso sollte ein neuer thread die anderen aus-mutex-en? ich habe da keine sperre eingebaut.
 
Poste doch mal etwas Source oder schick ihn per PM. Woher soll ich sonst wissen, was Deine Threads tun und was nicht?
 
Eigentlich gibs da nichts zu schreiben!

ich greife nur 1x auf den anderen thread zu. das muss es sein. Wenn ich die Daten aus dem anderen thread rauslese muss diese natürlich warten!

lässt sich das problem loslösen durch den detach lösen?

also bei mir sieht es so aus!

thread 1.... net socket.
thread 2.... reine daten auswertung.

thread 2 liest die latenz des thread 1. Latenz wird durch die Zeitmessung gemacht und in eine Variable gespeichert.
thread 2 liest daten und schläft dann für x sekunden. Nach x sekunden wertet dieser wieder die daten aus und schläft weiter. USW..
 
Schreib doch bitte den Sourcecode einmal hier auf. Du kannst ja Deine "wertvollen" Zeilen auslassen. Wichtig ist, dass Du alle Threadfunktionen und Synchronisationsmechanismen hier darstellst.

Funktionsrumpf A (thread funktion) {
...
while(...) {
...
pthread_mutex_lock(...);
...
pthread_mutex_unlock(...);
...
sleep(...);
...
}
...
}

So in der Art - verstehst Du?

Dann können wir Dir auch bestimmt helfen.

--------------------

pthread_detach bewirkt nur, dass der erzeugende Thread nicht auf den erzeugten Thread warten muss, und das der Speicher des erzeugten Threads automatisch vom System freigegeben wird, sobald er terminiert.
 
uuuups.... leute tut mir sehr leid!

ja es funktioniert. Ich habe leider vergessen die thread funktion aufzurufen die den thread startet. habe direkt die endlosschleife laufen lassen. Deswegen hatte es auch nicht geklappt!
ja alles läuft supper! danke
 
roker002 schrieb:
uuuups.... leute tut mir sehr leid!

ja es funktioniert. Ich habe leider vergessen die thread funktion aufzurufen die den thread startet. habe direkt die endlosschleife laufen lassen. Deswegen hatte es auch nicht geklappt!
ja alles läuft supper! danke

Meinst Du pthread_create?

Die Threadfunktion aus dem Mainthread aufzurufen bedeutet übrigens, dass diese Funktion dann im Mainthread abläuft und keinen neuen Thread abspaltet. Du musst explizit pthread_create verwenden.
 
Code:
void setpoints_start_points_thread()
{
	int	thread;
	thread = pthread_create(&setpoints_pthread, NULL, (void *)&setpoints_refreshing, NULL);
	if(thread != 0)
	{
		switch(thread)
		{
			case EAGAIN:
				printf("\nThe system lacked the necessary resources to  create  another  thread,  or  the  system-imposed  limit  on  the  total  number  of  threads  in  a  process {PTHREAD_THREADS_MAX} would be exceeded.\n\n");
				exit(EXIT_FAILURE);
				break;
			case EINVAL:
				printf("\nThe value specified by attr is invalid.\n\n");
				exit(EXIT_FAILURE);
				break;
			case EPERM:
				printf("\nThe caller does not have appropriate permission to set the required scheduling parameters or scheduling policy.\n\n");
				exit(EXIT_FAILURE);
				break;
		}
	}
}
diese funktion hätte ich aufrufen sollen, hab stattdesen direkt setpoints_refreshing() aufgerufen.
hmm ist schon bisschen blöd von mir!
 
Zurück
Oben