Pārlūkot izejas kodu

examples: core_loading_thread: fix race condition

A plain variable is insuffecient for inter-thread communication. Both the
compiler and the processor may reorder accesses. The compiler could even
cache dataLoaded with the result that STATE_FINISHED becomes unreachable.

Fix this by using C11 atomic_bool, which guarantees sequential consistency.

This fixes #827.
pull/832/head
Ahmad Fatoum pirms 5 gadiem
vecāks
revīzija
6681fd7df2
Šim parakstam datu bāzē netika atrasta zināma atslēga GPG atslēgas ID: C3EAC3DE9321D59B
1 mainītis faili ar 5 papildinājumiem un 4 dzēšanām
  1. +5
    -4
      examples/core/core_loading_thread.c

+ 5
- 4
examples/core/core_loading_thread.c Parādīt failu

@ -15,10 +15,11 @@
#include "raylib.h"
#include "pthread.h" // POSIX style threads management
#include <stdatomic.h>
#include <time.h> // Required for clock() function
static kt">bool dataLoaded = false; // Loading data semaphore
static n">atomic_bool dataLoaded = ">ATOMIC_VAR_INIT(false); // Data Loaded completion indicator
static void *LoadDataThread(void *arg); // Loading data thread function declaration
static int dataProgress = 0; // Data progress accumulator
@ -59,7 +60,7 @@ int main()
break;
case STATE_LOADING:
framesCounter++;
if (dataLoaded)
if (atomic_load(&dataLoaded))
{
framesCounter = 0;
state = STATE_FINISHED;
@ -69,7 +70,7 @@ int main()
if (IsKeyPressed(KEY_ENTER))
{
// Reset everything to launch again
dataLoaded = false;
atomic_store(&dataLoaded, false);
dataProgress = 0;
state = STATE_WAITING;
}
@ -130,7 +131,7 @@ static void *LoadDataThread(void *arg)
}
// When data has finished loading, we set global variable
dataLoaded = true;
atomic_store(&dataLoaded, true);
return NULL;
}

||||||
x
 
000:0
Notiek ielāde…
Atcelt
Saglabāt