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.
This commit is contained in:
parent
53d9beb534
commit
6681fd7df2
1 changed files with 5 additions and 4 deletions
|
@ -15,10 +15,11 @@
|
||||||
#include "raylib.h"
|
#include "raylib.h"
|
||||||
|
|
||||||
#include "pthread.h" // POSIX style threads management
|
#include "pthread.h" // POSIX style threads management
|
||||||
|
#include <stdatomic.h>
|
||||||
|
|
||||||
#include <time.h> // Required for clock() function
|
#include <time.h> // Required for clock() function
|
||||||
|
|
||||||
static bool dataLoaded = false; // Loading data semaphore
|
static atomic_bool dataLoaded = ATOMIC_VAR_INIT(false); // Data Loaded completion indicator
|
||||||
static void *LoadDataThread(void *arg); // Loading data thread function declaration
|
static void *LoadDataThread(void *arg); // Loading data thread function declaration
|
||||||
|
|
||||||
static int dataProgress = 0; // Data progress accumulator
|
static int dataProgress = 0; // Data progress accumulator
|
||||||
|
@ -59,7 +60,7 @@ int main()
|
||||||
break;
|
break;
|
||||||
case STATE_LOADING:
|
case STATE_LOADING:
|
||||||
framesCounter++;
|
framesCounter++;
|
||||||
if (dataLoaded)
|
if (atomic_load(&dataLoaded))
|
||||||
{
|
{
|
||||||
framesCounter = 0;
|
framesCounter = 0;
|
||||||
state = STATE_FINISHED;
|
state = STATE_FINISHED;
|
||||||
|
@ -69,7 +70,7 @@ int main()
|
||||||
if (IsKeyPressed(KEY_ENTER))
|
if (IsKeyPressed(KEY_ENTER))
|
||||||
{
|
{
|
||||||
// Reset everything to launch again
|
// Reset everything to launch again
|
||||||
dataLoaded = false;
|
atomic_store(&dataLoaded, false);
|
||||||
dataProgress = 0;
|
dataProgress = 0;
|
||||||
state = STATE_WAITING;
|
state = STATE_WAITING;
|
||||||
}
|
}
|
||||||
|
@ -130,7 +131,7 @@ static void *LoadDataThread(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// When data has finished loading, we set global variable
|
// When data has finished loading, we set global variable
|
||||||
dataLoaded = true;
|
atomic_store(&dataLoaded, true);
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue