解决互斥信号量同步死锁问题记录
解决互斥信号量同步死锁问题记录
使用变量在指定位置计数,查看运行次数,知道在哪一个地方阻塞
bool SysData_UpdateWagon(uint32_t mac, uint8_t track, int32_t lat, int32_t lon) {
bool success = false;
if (xSemaphoreTake(xDataMutex, portMAX_DELAY) == pdTRUE) {
int i;
for(i=0; i<g_SysData.wagon_count; i++) {
if(g_SysData.wagons[i].mac == mac) {
success = true;
return success;//错误此处直接带着锁返回了,并没有运行到释放锁的位置,因此造成死锁
break;//正确,跳出循环,能够在后面释放锁
}
}
if(!success && g_SysData.wagon_count < MAX_WAGONS) {
int idx = g_SysData.wagon_count;
g_SysData.wagons[idx].mac = mac;
g_SysData.wagons[idx].track_id = track;
g_SysData.wagons[idx].lat_x1E6 = lat;
g_SysData.wagons[idx].lon_x1E6 = lon;
g_SysData.wagons[idx].is_allocated = false;
g_SysData.wagon_count++;
}
xSemaphoreGive(xDataMutex);
}
return success;
}
上面使用的互斥信号量和二值信号量的区别主要有三个:
互斥信号量和二值信号量都是有0和1两个状态,但是互斥信号量有优先级继承,比如A和B任务,优先级A>B。
当B在使用这个互斥锁,A想要使用的时候,B的优先级会被提高到和A一样高,以便于B任务迅速干完活后把锁释放,A优先级能够取锁;这样A高优先级的任务不会被低优先级任务B阻塞。
互斥信号量不能在中断中使用,因为中断用不了优先级继承。
互斥信号量有所有权限制,比如A任务取走信号量,那么只能是A来还。
浙公网安备 33010602011771号