我在vxWorks平台上运行了一个C++程序,以测试互斥锁和二进制信号量之间的时间差异。下面是原型程序
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毫秒。我很惊讶地发现,在没有争用的情况下,互斥锁比二进制信号量更快。这是否是预期的?还是我漏掉了什么?任何帮助都将不胜感激!