Ho trovato un certo codice in FreeRTOS (FreeRTOSV7.4.0 \ FreeRTOS \ Source \ tasks.c):L'incremento automatico nel thread C è sicuro?
void vTaskSuspendAll(void)
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
}
è esplicitamente detto no necessità di proteggere a causa del tipo è "portBASE_TYPE", che è una " lungo "tipo. La mia comprensione è che presuppone che l'auto-incremento di questo tipo sia atomico. Ma dopo che l'ho smontato non ho trovato nessuna prova, è un semplice carico-> add-> store. Allora è un problema?
void vTaskSuspendAll(void)
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
4dc: 4b03 ldr r3, [pc, #12] ; (4ec <vTaskSuspendAll+0x10>)
4de: f8d3 2118 ldr.w r2, [r3, #280] ; 0x118
4e2: 1c50 adds r0, r2, #1
4e4: f8c3 0118 str.w r0, [r3, #280] ; 0x118
4e8: 4770 bx lr
4ea: bf00 nop
4ec: 00000000 .word 0x00000000
000004f0 <xTaskGetTickCount>:
return xAlreadyYielded;
}
Non è definito da C. Dipende dalla piattaforma di compilatore/hardware. –
Una buona politica da adottare quando si ha a che fare con la sicurezza del thread è questa: se c'è anche il più piccolo brandello di una possibilità che si verifichi una condizione di competizione, allora si verificherà. Questo non risponde alla tua domanda, ma è utile per rassicurarti che il blocco è importante se ti trovi mai a pensare "questa operazione è così quasi atomica che non ho bisogno di bloccare". – paddy
Infine, trovo il motivo per cui è sicuro qui. Ringrazia tutti! [link] (http://www.freertos.org/FreeRTOS_Support_Forum_Archive/February_2010/freertos_portBASE_TYPE_amp_critical_section_3560405.html) – user1603164