Browse Source

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 5 years ago
parent
commit
6681fd7df2
No known key found for this signature in database GPG Key ID: C3EAC3DE9321D59B
1 changed files with 5 additions and 4 deletions
  1. +5
    -4
      examples/core/core_loading_thread.c

+ 5
- 4
examples/core/core_loading_thread.c View File

@ -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;
}

Loading…
Cancel
Save