Hello Max,
I believe you are referring to threads while asking about Critical Section? Ring creates another VM instances while running threads, therefore it is possible to run threads without synchronization. You need only to follow following rule about the global variables:
Ring uses jagged arrays (lists) to take advantage: where each thread can use its own sub-list to work on data independently. Once thread finishes processing of the data, parent lists can be swapped to exchange sub-lists between the parent and the thread for new processing.
This however works without synchronization only with one thread. More threads will require synchronization, unless parent is the one doing swap which requires signaling.
Other kind (not jagged) of the global variables requires synchronization. You have more than one library available (ringlibuv, ringthread, allegro) depending on your requirements, my preferred is ringlibuv because of the nice synchronization implementation where only one thread is allowed to write and multiple threads can read