Я запустил пример программы на C++ на платформе vxWorks, чтобы проверить разницу во времени между мьютексом и двоичным семафором. Приведенная ниже программа является прототипом
SEM ID semMutex;
UINT ITER = 10000;
taskIdOne = TASKSPAWN("t1",TASK_PRIORITY_2,0,8192,0,(FUNCPTR)myMutexMethod,0,0);
taskIdTwo = TASKSPAWN("t2",TASK_PRIORITY_2,0,8192,0,(FUNCPTR)myMutexMethod,0,0);
void myMutexMethod(void)
{
int i;
VKI_PRINTF("I'm (%s)\n",TASKNAME(0) );
myMutexTimer.start();
for (i=0; i < ITER; i++)
{
MUTEX_LOCK(semMutex,WAIT_FOREVER);
++global;
MUTEX_UNLOCK(semMutex);
}
myMutexTimer.stop();
myMutexTimer.show();
}
В приведенной выше программе есть конфликт (2 задачи пытаются получить мьютекс). мой таймер напечатал 37,43 мс для вышеуказанной программы. С тем же прототипом программа двоичного семафора занимала всего 2,8 мс. Это понятно, потому что двоичный семафор легкий и не имеет многих функций, таких как мьютекс (инверсия приоритета, владение и т. д.).
Однако я удалил одну задачу и запустил указанную выше программу (без конфликтов). Поскольку конкуренции нет, задача t1 просто получает мьютекс, выполняет критическую секцию и затем освобождает мьютекс. То же самое с бинарным семафором.
Что касается таймингов, мьютекс у меня получился 3,35 мс, а бинарный семафор 4 мс.
Я удивлен, увидев, что мьютекс работает быстрее, чем двоичный семафор, когда нет конкуренции.
Ожидается ли это? или я что-то упускаю?
Любая помощь приветствуется. !