время выполнения?Как рассчитать? - PullRequest
0 голосов
/ 10 сентября 2011

В моем приложении мне нужно вычислить время выполнения каждого потока [буквально время, которое потребовалось с начала pthread и его завершения выполнения].Прекращение может быть типа 'pthread_exit' или явной отмены.В следующем коде я использовал специальные данные pthread, чтобы сохранить время начала каждого потока, и, следовательно, я мог найти общее время.Ребята, вы думаете, что следующий подход имеет смысл?Если нет, вход действительно ценится !!!В целях тестирования поток отменяет сам себя после некоторого периода сна.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

typedef struct _pTime
{
    time_t stime;
}pTime;

pthread_key_t kstime;

void   cancelRoutine (void * arg)
{
    pTime etime, *btime;
    time (&(etime.stime));
    printf (" Inside cancelRoutine ...tid: %l \n", pthread_self());
    btime = (pTime *) pthread_getspecific (kstime);
    printf ("Time taken :  %lf ", difftime (etime.stime, btime->stime));
}

void * tfunction ( void * arg)
{
    int waitTime = (int) arg;
    printf ("\n Wait Time is %ud ", waitTime);
    pTime  *start;
    start = (pTime *) malloc (sizeof (pTime));
    time (&(start->stime));

    pthread_setspecific (kstime, start);
    pthread_cleanup_push (cancelRoutine, NULL);
    printf (" Invoking the  thread \n");
    /* Doing Certain Work here */
    sleep (waitTime);
    pthread_cancel ( pthread_self());
    sleep(waitTime);
    pthread_cleanup_pop (NULL);
}

int main ( int argc, char **argv)
{
    pthread_t tid[2];
    int toBeSpend=10, i;
    pthread_key_create(&kstime, NULL);

    for (i=0; i<2; i++)
        pthread_create (&tid[i], NULL, tfunction, (void *)(toBeSpend*(i+1)));
    sleep (3);
    for(i=0; i<2; i++)
        pthread_join (tid[i], NULL);
}

1 Ответ

0 голосов
/ 10 сентября 2011

Мне кажется, это нормально (хотя мне не нравятся конкретные переменные потока, я предпочитаю использовать обработчики сигналов потока, чтобы поймать «отмену», хотя ваш код кажется довольно изящным)

Одна вещь, которую вы должныулучшением является вызов time (&(start->stime));

Это должно быть первым делом , которое должна выполнять функция потока (сначала в локальном var, а затем скопировать его в pTime с malloc'ом)так как вы вызываете системные вызовы до этого (отнимает много времени, относительности, а также может блокировать).

также вы можете захотеть работать с помощью инструментов профилирования, таких как gprof.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...