Armadilloフォーラム

C言語プログラミング(pthread_cond_timedwait)

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

2016年11月21日 18時59分

再現用の最小コードはありますか? compile オプションと一緒にもらえると嬉しいです。

at_yashi

2016年11月22日 11時23分

/* 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

2016年11月22日 12時10分

ありがとうございます。
解決しました。

以下の★★行を追加したところ、動作しました。
★★行を行っていない場合、結果が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);

大変お手数おかけしました。
ありがとうございました。