gettimeofday的奇怪行为

时间:2013-04-18 14:54:04

标签: c variables global-variables

我想获得一个线程进入Critical Zone之间经过的时间,另一个线程获取permision进入ARM CortexA8上的同一个Critical Zone。为此,我一直在使用函数gettimeofday()在C。

   void *Thread1_Routine ();     //Create the Semaphore
void *Thread2_Routine (); //Wait for Thread1_Routine's Semaphore
void configured_malloc_behavior();
void Calc_Dif_Time (struct timeval *time1,struct timeval *time2);

//Definition to represent the time
typedef struct te_tim96
{
    int64_t sec;
    int32_t usec;
}te_tim96;
//Variables to save the time
struct timeval t1,t2;
//Variable to control the order enter Critical zone
char lock=0;
int count=0;


//Variable to make the create the mutex
pthread_mutex_t mutex;

int main (void)
{
    //Variables define threads
    pthread_t threadadd1, threadadd2;
    pthread_attr_t attr1, attr2;
    struct sched_param p1, p2;

    //Configured malloc behavior
    configured_malloc_behavior();

    //Init the Thread
    pthread_mutex_init(&mutex, NULL);

    //Define Threads
    pthread_attr_init(&attr1);
    pthread_attr_init(&attr2);
    //Thread1
    pthread_attr_setschedpolicy(&attr1, SCHED_FIFO);
    p1.sched_priority= 98; //This is lower than Thread2
    pthread_attr_setschedparam(&attr1, &p1);
    //Thread2
    pthread_attr_setschedpolicy(&attr2, SCHED_FIFO);
    p2.sched_priority= 99;
    pthread_attr_setschedparam(&attr2, &p2);
//End define Threads


//Init the gpio63 as Output
    do Stuff()  

//Create the threads                                            
    pthread_create(&threadadd1,&attr1,&Thread1_Routine, NULL);
    pthread_create(&threadadd2,&attr2,&Thread2_Routine, NULL);


//Wait to end the Threads ()
    pthread_join(threadadd1, NULL);
    pthread_join(threadadd2, NULL);
    return 0;
}


//Thread Producer
void *Thread1_Routine (void)
{
//Variable to write in gpio/value
char value=1;
    while (count<MAXCOUNT)
    {
        sleep (3);
        pthread_mutex_lock(&mutex);
        lock=lock+1;    //Increment variable lock to indicate that the Thread Producer was done.
        gettimeofday(&t1, NULL);
        pthread_mutex_unlock(&mutex);
    }
    pthread_exit(NULL);
}

//Thread Consumer
void *Thread2_Routine (void)
{
//Variable to write in gpio/value
char value=0;
    while (count<MAXCOUNT)
    {
    //Wait for the semaphore is free!!!!!
        while (lock=0);
        pthread_mutex_lock(&mutex);
        lock=lock-1;    //Decrement variable lock to indicate that the Thread Producer was done.
        gettimeofday(&t2, NULL);
        Calc_Dif_Time(&t1, &t2); //Function to calculate the latency and plot it
        pthread_mutex_unlock(&mutex);
        count++; //To incremate the count of how many time goes the thread are made
    }
    pthread_exit(NULL);
}

void Calc_Dif_Time (struct timeval *time1,struct timeval *time2)
{
struct te_tim96 Tmeasure1, Tmeasure2;
double Elapsedtime;
//TmeasureY=tY
Tmeasure1.sec=(*time1).tv_sec;
Tmeasure1.usec=(*time1).tv_usec;
Tmeasure2.sec=(*time2).tv_sec;
Tmeasure2.usec=(*time2).tv_usec;

//Calculate
    //Part in sec to miliseconds
    Elapsedtime=(Tmeasure2.sec-Tmeasure1.sec)*1000;
    //Part in usec to miliseconds
    Elapsedtime+=(Tmeasure2.usec-Tmeasure1.usec)*0.001;

    //Work with the rest of the division to convert usec to miliseconds
    printf("Time to create the Semaphore[%lld.%6ld] Time to take the Semaphore[%lld.%6ld] Elapsed Time [%f ms]\n", Tmeasure1.sec, Tmeasure1.usec, Tmeasure2.sec, Tmeasure2.usec, Elapsedtime);
    Elapsedtime=0; //Reset Elapsedtime to the next measure
    }

该程序没有错误,但我执行它时的问题是控制台显示以下结果:

  

./ R_T_Measure4

     

创建信号量的时间[0。 0]获取信号量的时间[4878.153276]经过时间[4878153.276000 ms]

     

创建信号量的时间[0。 0]获取信号量的时间[4878.153886]经过时间[4878153.886000 ms]

此结果显示了t1变量指向不正确或重新启动的方式。但我不知道在这种情况下我会忽视因为t2效果很好。

任何帮助都将不胜感激

-Regards

2 个答案:

答案 0 :(得分:1)

您的while循环没有等待锁定免费。当你执行while (lock=0);时,它将始终返回0,并且您将立即结束循环,并且还会弄乱您的锁定,因为您正在设置lock变量。您应该使用while (lock == 0);

答案 1 :(得分:0)

你总是从线程2调用Calc_Dif_Time,所以如果线程2在线程1 t1未被初始化之前获得锁定