ich einige Code in FreeRTOS (FreeRTOSV7.4.0 \ FreeRTOS \ Source \ tasks.c) gefunden:Ist die Selbstinkremente in C threadsicher?
void vTaskSuspendAll(void)
{
/* A critical section is not required as the variable is of type
portBASE_TYPE. */
++uxSchedulerSuspended;
}
Es wird ausdrücklich gesagt, keine Notwendigkeit, aufgrund der Art zu schützen ist "portBASE_TYPE", die ein " lang "tippen. Mein Verständnis ist, dass es davon ausgeht, dass das Selbstinkrement zu diesem Typ atomar ist. Aber nachdem ich es auseinander genommen habe, konnte ich keinen Beweis finden, es ist eine einfache Last-> hinzufügen-> speichern. Dann ist es ein Problem?
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;
}
Es definiert ist nicht von C. Es hängt von der Compiler/Hardware-Plattform. –
Eine gute Politik zu übernehmen, wenn sie mit Thread-Sicherheit zu tun, ist dies: Wenn es auch nur die kleinste Spur einer Chance, dass eine Race-Bedingung auftritt, treten sie dann. Dies beantwortet Ihre Frage nicht, aber es ist nützlich, sich zu vergewissern, dass Sperren wichtig ist, wenn Sie sich jemals denken, dass "diese Operation so atomar ist, dass ich sie nicht sperren muss". – paddy
Schließlich finde ich den Grund, warum es hier sicher ist. Danke allen! [link] (http://www.freertos.org/FreeRTOS_Support_Forum_Archive/February_2010/freertos_portBASE_TYPE_amp_critical_section_3560405.html) – user1603164