[0faacb8] | 1 | \chapter{Concurrency in \CFA}\label{s:cfa_concurrency} |
---|
| 2 | |
---|
[9a5a2cd] | 3 | The groundwork for concurrency in \CFA was laid by Thierry Delisle in his Master's Thesis\cite{Delisle18}. |
---|
| 4 | In that work he introduced coroutines, user level threading, and monitors. |
---|
| 5 | Not listed in that work were the other concurrency features that were needed as building blocks, such as locks, futures, and condition variables which he also added to \CFA. |
---|
[0faacb8] | 6 | |
---|
| 7 | \section{Threading Model}\label{s:threading} |
---|
[9a5a2cd] | 8 | \CFA has user level threading and supports a $M:N$ threading model where $M$ user threads are scheduled on $N$ cores, where both $M$ and $N$ can be explicitly set by the user. |
---|
| 9 | Cores are used by a program by creating instances of a \code{processor} struct. |
---|
| 10 | User threads types are defined using the \code{thread} keyword, in the place where a \code{struct} keyword is typically used. |
---|
| 11 | For each thread type a corresponding main must be defined, which is where the thread starts running once it is created. |
---|
| 12 | Listing~\ref{l:cfa_thd_init} shows an example of processor and thread creation. |
---|
| 13 | When processors are added, they are added alongside the existing processor given to each program. |
---|
| 14 | Thus if you want $N$ processors you need to allocate $N-1$. |
---|
| 15 | To join a thread the thread must be deallocated, either deleted if it is allocated on the heap, or go out of scope if stack allocated. |
---|
| 16 | The thread performing the deallocation will wait for the thread being deallocated to terminate before the deallocation can occur. |
---|
| 17 | A thread terminates by returning from the main routine where it starts. |
---|
[0faacb8] | 18 | |
---|
[9363b1b] | 19 | \begin{cfa}[tabsize=3,caption={\CFA user thread and processor creation},label={l:cfa_thd_init}] |
---|
[0faacb8] | 20 | |
---|
| 21 | thread my_thread {} // user thread type |
---|
| 22 | void main( my_thread & this ) { // thread start routine |
---|
| 23 | printf("Hello threading world\n"); |
---|
| 24 | } |
---|
| 25 | |
---|
| 26 | int main() { |
---|
| 27 | // add 2 processors, now 3 total |
---|
| 28 | processor p[2]; |
---|
| 29 | { |
---|
| 30 | my_thread t1; |
---|
| 31 | my_thread t2; |
---|
| 32 | } // waits for threads to end before going out of scope |
---|
| 33 | } |
---|
| 34 | |
---|
[9363b1b] | 35 | \end{cfa} |
---|