nagaishi
2016年11月21日 18時03分
armadillo-440で、pthread_cond_timedwaitを使った実績がありましたら、ご教授お願いいたします。
armadillo-440の環境でシリアル通信プログラムを作成しております。
電文送信し、応答電文待ちのタイムアウト処理をpthread_cond_timedwait使って実現しようとしていますが、
ATDE5上では正常に動作していたのですが、
armadillo-440上では、pthread_cond_timedwaitでタイムアウトしなくなりました。
試しに、pthread_cond_timedwaitをpthread_cond_waitに変えた所、延々と待機する動作しました。
この事から、pthread_cond_timedwaitがarmadillo-440上で動作しないのではないかと推測しております。
コメント
at_yashi
/* a.c */ #include <pthread.h> #include <stdio.h> #include <errno.h> int main() { pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t c = PTHREAD_COND_INITIALIZER; struct timespec t; int ret; clock_gettime(CLOCK_REALTIME, &t); t.tv_sec += 2; ret = pthread_cond_timedwait(&c, &m, &t); if (ret == ETIMEDOUT) printf("timeout!\n"); return 0; }
$ arm-linux-gnueabi-gcc -Wall -Wextra -g a.c -lpthread -lrt
で、timeoutしているように見えます。なにか私が勘違いしていますか?
nagaishi
ありがとうございます。
解決しました。
以下の★★行を追加したところ、動作しました。
★★行を行っていない場合、結果がEINVALとなっておりました。
struct timespec timeout;
struct timeval now;
int iRetTimeout = 0;
gettimeofday(&now, NULL);
timeout.tv_nsec = now.tv_usec * 1000;//★★
timeout.tv_sec = now.tv_sec + 5;
pthread_mutex_lock(&mu);
iRetTimeout = pthread_cond_timedwait(&co, &mu, &timeout);
switch(iRetTimeout){
case ETIMEDOUT: printf("--> %s: timeout\n", name); break;
case EINVAL: printf("--> %s: error\n", name); break;
default: printf("--> %s: through(%d)\n", name, iRetTimeout); break;
}
pthread_mutex_unlock(&mu);
大変お手数おかけしました。
ありがとうございました。
at_yashi
2016年11月21日 18時59分
再現用の最小コードはありますか? compile オプションと一緒にもらえると嬉しいです。