Время переключения задачи из теста Rhealstone с помощью pthread_yield()

#pthreads #real-time #benchmarking

#pthreads #в режиме реального времени #сравнительный анализ

Вопрос:

Я пытаюсь реализовать бенчмарк переключения задач Rhealstone в Linux. Вот исходный код:http://pastebin.com/aYF4Tnvt

И вот что я написал до сих пор:http://pastebin.com/tX7zK7h7

Проблема в том, что циклы for выполняются произвольно несколько раз, и программа завершается. Кто-нибудь может указать мне правильное направление? Я программист-новичок, и я действительно запутался в этом материале.

Комментарии:

1. Вы должны использовать CLOCK_MONOTONIC , а не CLOCK_REALTIME .

2. Почему это? Какая разница?

3. CLOCK_REALTIME это время суток, что означает, что оно может перемещаться вперед или назад по мере настройки часов (например, с помощью NTP). CLOCK_MONOTONIC выполняется со скоростью времени настенных часов, но никогда не скачет вперед или назад — это для измерения временных интервалов.

Ответ №1:

объединить () потоки в main(). Вы выпадаете из main и завершаете свою программу, что приводит к прекращению работы других потоков. Измените код на что-то вроде

 clock_gettime(CLOCK_REALTIME, amp;start_time);

pthread_t threadID[2];

pthread_create(amp;threadID[0], NULL, task1, NULL);

pthread_create(amp;threadID[1], NULL, task2, NULL);  

for (int i = 0; i < 2;   i)
    pthread_join(threadID[i], NULL);

clock_gettime(CLOCK_REALTIME, amp;end_time);

//... the rest
  

Не уверен, куда именно вы хотите поместить этот таймер завершения. Таким образом, вы также будете синхронизировать два вызова join (), но они должны быть минимальными. Если вы установите таймер перед объединением, то вы завершите свой таймер задолго до фактического завершения ваших потоков — все, что вы будете определять, это время, необходимое для завершения двух вызовов create_thread.