Синхронизация двоичного семафора и мьютекса

Я запустил пример программы на 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 мс.

Я удивлен, что мьютекс быстрее, чем двоичный семафор, когда нет споров.
Это ожидается? или я что-то упустил?

Любая помощь приветствуется. !

3

Решение

В этом случае мьютекс, вероятно, быстрее из-за того, что одна и та же задача выполняет его снова и снова, без участия другой задачи. Я предполагаю, что мьютексный код использует ярлык для включения рекурсивных мьютексных вызовов (то есть одна и та же задача принимает один и тот же мьютекс дважды). Даже если ваш код технически не является рекурсивным мьютексом, код, вероятно, использует тот же ярлык из-за того, что владелец семафора не был перезаписан какой-либо другой задачей, выполняющей семафор.

Другими словами, вы делаете:

1) semTake(semMutex)
2) ++global;
3) semGive(semMutex) // sem owner flag is not changed
4) sameTake(semMutex) // from same task as previous semTake
...

Затем на шаге 4 semTake видит, что владелец sem == идентификатор текущей задачи (потому что владелец sem был установлен на шаге 1 и никогда не менялся на что-либо другое), поэтому он просто помечает семафор как взятый и быстро выпрыгивает.

Конечно, это предположение, быстрый взгляд на исходный код и некоторые точки останова оболочки vxworks может подтвердить это, что я не могу сделать, потому что у меня больше нет доступа к vxworks.

Дополнительно посмотрите документацию по semMLib для получения некоторой документации по рекурсивному использованию мьютекса.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]