🟥 Atomic, thread, thread pool, mutex, condition variable
Threading is a library defining basic primitives for user-space threading and synchronization.
Features
Class | Description |
SC::Thread | A native OS thread. |
SC::ThreadPool | Simple thread pool that executes tasks in a fixed number of worker threads. |
SC::Mutex | A native OS mutex to synchronize access to shared resources. |
SC::ConditionVariable | A native OS condition variable. |
SC::Atomic | Atomic variables (only for int and bool for now). |
SC::EventObject | An automatically reset event object to synchronize two threads. |
Status
🟥 Draft
Only the features needed for other libraries have been implemented so far. The Atomic header is really only being implemented for a few data types and needs some love to extend and improve it.
Videos
This is the list of videos that have been recorded showing some of the internal thoughts that have been going into this library:
SC::Thread
A native OS thread.
Example:
Thread thread;
thread.start([](Thread& thread)
{
thread.setThreadName(SC_NATIVE_STR("My Thread"));
Thread::Sleep(1000);
});
thread.join();
thread.detach();
- Warning
- Thread destructor will assert if SC::Thread::detach() or SC::Thread::join() has not been called.
SC::ThreadPool
Simple thread pool that executes tasks in a fixed number of worker threads.
This class is not copyable / moveable due to it containing Mutex and Condition variable. Additionally, this class does not allocate any memory by itself, and expects the caller to supply SC::ThreadPool::Task objects.
- Warning
- The caller is responsible of keeping Task address stable until the it will be completed. If it's not already completed the task must still be valid during ThreadPool::destroy or ThreadPool destructor.
Example:
static const size_t wantedThreads = 4;
static const size_t numTasks = 100;
size_t values[numTasks];
for (size_t idx = 0; idx < numTasks; idx++)
{
size_t* value = values + idx;
*value = idx;
{
if (*value % 2)
{
}
*value *= 100;
};
}
bool allGood = true;
for (size_t idx = 0; idx < numTasks; idx++)
{
allGood = allGood && (values[idx] == idx * 100);
}
SC::Mutex
A native OS mutex to synchronize access to shared resources.
Example:
Mutex mutex;
int globalVariable = 0;
Thread thread1;
auto thread1Func = [&](Thread& thread)
{
thread.setThreadName(SC_NATIVE_STR("Thread1"));
mutex.lock();
globalVariable++;
mutex.unlock();
};
Thread thread2;
auto thread2Func = [&](Thread& thread)
{
thread.setThreadName(SC_NATIVE_STR("Signaling2"));
mutex.lock();
globalVariable++;
mutex.unlock();
};
SC::EventObject
An automatically reset event object to synchronize two threads.
Example:
EventObject eventObject;
Thread threadWaiting;
auto waitingFunc = [&](Thread& thread)
{
thread.setThreadName(SC_NATIVE_STR("Thread waiting"));
eventObject.wait();
};
Thread threadSignaling;
auto signalingFunc = [&](Thread& thread)
{
thread.setThreadName(SC_NATIVE_STR("Signaling thread"));
eventObject.signal();
};
SC::Atomic
Atomic variables (only for int
and bool
for now).
Example:
Atomic<bool> test = true;
test.exchange(false);
#define SC_TEST_EXPECT(e)
Records a test expectation (eventually aborting or breaking o n failed test)
Definition Testing.h:116
Roadmap
🟨 MVP
🟩 Usable
🟦 Complete Features:
- Support more types in Atomic<T>
- ReadWrite Lock
- Barrier