The CAVELib used to only support multi-processing, in this paradigm each display pipe was an independent process with its own memory addresses. Because of this, if the main application process were to do any calculations the application developer would need to have a mechanism to pass the data to each of the display processes. For example, if the height of a bouncing ball was calculated in the main process, each display process would need to obtain the value of the new height of the ball each frame. One mechanism of passing this data into the display process is by shared memory. Shared memory is specially allocated memory that allows multiple proceesses to have read and write permissions to the same address. So within a multi-processing application the main process and the display processes could use shared memory for any common data that had to be exchanged between them. The CAVELib API functions CAVEMalloc() and CAVEFree() can be used to allocate and release shared memory, in the same manner as malloc() and free()can be used to allocate and release regular memory. The amount of shared memory that can be allocated depends on the size of the application's shared memory arena, which can be set using CAVESetOption() this must be done before calling CAVEConfigure() though, as it is withing this function that the arena is created. Alternatively, CAVEUserSharedMemory() can be called to create a shared memory arena, which can then be used with amalloc() (part of IRIX's standard libraries) to allocate memory from that arena. For a shared arena and any global shared pointers to be visible to all the processes, they must be allocated before CAVEInit() is called. Shared memory allocated from the arena after calling CAVEInit() is visible to all processes, but a pointer will need to be passed to any processes other than the process making the allocation. When using multi-threading instead of multi-processing these extra steps for sharing data are no longer needed. That's because threads share a common memory address space, in a sense all dynamic memory is shared by default when using threads.