2017-11-20 3 views
0

ich pthread_cond_timedwait in denen nenne ich unter Timeout-Wertpthread_cond_timedwait ret 22 aber errno ist Erfolg

clock_gettime(CLOCK_MONOTONIC, &timeout); 
//timeout.tv_sec+= 1; 
timeout.tv_nsec+= 100000000; 
ret = pthread_cond_timedwait(&Cond, &Mtx, &timeout); 

Jedoch setze nach einiger Zeit ich ret Wert 22 bin immer aber errno ist der Erfolg.

Wenn ich timeout.tv_sec aktivieren und auskommentieren timeout.tv_nsec dann sehe ich kein Problem und ich bekomme immer ret Wert Null, aber umgekehrt funktioniert nicht.

Kann mir jemand helfen zu verstehen, warum pthread_cond_timedwait 22 zurückgibt aber errno ist Null?

Antwort

2

Kann mir jemand helfen zu verstehen, warum pthread_cond_timedwait 22 zurückgibt, aber errno ist Null?

Pthreads-Funktionen können oder dürfen nicht gesetzt werden errno Wert; Ihre Rückgabewerte repräsentieren die Fehlerwerte. Sie können reterrno zuweisen und perror() oder strerror() aufrufen.

Aber nach einiger Zeit bekomme ich ret Wert 22 aber errno ist Erfolg.

Sie sagen, dass der Rückgabewert von pthread_cond_timedwait() Wert 22 ist (das ist in der Regel EINVAL), es gibt das Problem mit timeout.tv_nsec Wert liegt Sie passieren.

POSIX manual sagt:

EINVAL
Das abstime Argument einen Nanosekunde Wert kleiner als Null oder größer oder gleich Millionen bis 1000 festgelegt.

Da Sie tun:

timeout.tv_nsec+= 100000000; 

es wahrscheinlich, dass timedout.tv_nsec bereits einen Wert enthält und das Hinzufügen von 100 Millionen zu, dass in EINVAL führt. Wenn der obige Code in einer Funktion ist und wiederholt aufgerufen wird, dann wird beim 10. Aufruf timeout.tv_nsec auf 1000 Millionen kommen. Ich schlage vor, Sie stellen sicher, timeout.tv_nsec ist weniger als 1000 Millionen und versuchen Sie es erneut.

Zum Beispiel tun:

timeout.tv_nsec = 100000000; 

statt:

timeout.tv_nsec += 100000000; 
Verwandte Themen