1 | \chapter{Concurrency in \CFA}\label{s:cfa_concurrency} |
---|
2 | |
---|
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. |
---|
6 | |
---|
7 | \section{Threading Model}\label{s:threading} |
---|
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. |
---|
18 | |
---|
19 | \begin{cfa}[tabsize=3,caption={\CFA user thread and processor creation},label={l:cfa_thd_init}] |
---|
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 | |
---|
35 | \end{cfa} |
---|