2017-11-20 9 views
0
私はここで私はいくつかの時間後、私はRET値22を取得していますが、errnoには成功で、

pthread_cond_timedwaitのRETを22しかし、errnoが成功

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

ただし、タイムアウト値以下に設定していますpthread_cond_timedwaitを呼び出してい

です。

timeout.tv_secを有効にして、timeout.tv_nsecをコメントアウトした場合、問題は発生していないため、常にゼロ値を取得していますが、その逆も機能しません。

は、誰もがpthread_cond_timedwaitリターン22しかしerrnoがゼロである理由私が理解するのに役立つことはできますか?

答えて

2

なぜpthread_cond_timedwaitが22を返しますが、errnoはゼロであるのか理解できますか?

Pthreadsの機能もよい又はerrno値を設定しなくてもよいです。それらの戻り値はエラー値を表します。 reterrnoに割り当て、perror()またはstrerror()と呼び出してください。

ただし、しばらくしてからは、値22に戻りますが、errnoは成功です。あなたがpthread_cond_timedwait()値の戻り値が(通常EINVALである)22であると言う

、それは問題はあなたが合格timeout.tv_nsec値であるを示しています。

POSIX manualは言う:

EINVAL
ABSTIME引数が1000百万ゼロ未満または以上のナノ秒の値を指定しました。

あなたが行うので:

timeout.tv_nsec+= 100000000; 

それはtimedout.tv_nsecは、すでにいくつかの値が含まれており、それに億を追加することがEINVALにつながる可能性があります。上記のコードが関数内にあり、それが繰り返し呼び出された場合、10番目の呼び出しでtimeout.tv_nsecは1000万に達するでしょう。 timeout.tv_nsecが1000万未満であることを確認してから、もう一度お試しください。例えば

は、実行します。

timeout.tv_nsec = 100000000; 

の代わり:

timeout.tv_nsec += 100000000; 
関連する問題