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 generators, coroutines, monitors, and user-level threading.
|
---|
5 | Not listed in that work were basic concurrency features 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 provides user-level threading and supports an $M$:$N$ threading model where $M$ user threads are scheduled on $N$ kernel threads, where both $M$ and $N$ can be explicitly set by the user.
|
---|
9 | Kernel threads are created by declaring a @processor@ structure.
|
---|
10 | User-thread types are defined by creating a @thread@ aggregate-type, \ie replace @struct@ with @thread@.
|
---|
11 | For each thread type a corresponding @main@ routine must be defined, which is where the thread starts running once it is created.
|
---|
12 | Examples of \CFA user thread and processor creation are shown in \VRef[Listing]{l:cfa_thd_init}.
|
---|
13 |
|
---|
14 | \begin{cfa}[caption={Example of \CFA user thread and processor creation},label={l:cfa_thd_init}]
|
---|
15 | @thread@ my_thread {...}; $\C{// user thread type}$
|
---|
16 | void @main@( my_thread & this ) { $\C{// thread start routine}$
|
---|
17 | sout | "Hello threading world";
|
---|
18 | }
|
---|
19 |
|
---|
20 | int main() {
|
---|
21 | @processor@ p[2]; $\C{// add 2 processors = 3 total with starting processor}$
|
---|
22 | {
|
---|
23 | my_thread t[2], * t3 = new(); $\C{// create 3 user threads, running in main routine}$
|
---|
24 | ... // execute concurrently
|
---|
25 | delete( t3 ); $\C{// wait for thread to end and deallocate}$
|
---|
26 | } // wait for threads to end and deallocate
|
---|
27 | }
|
---|
28 | \end{cfa}
|
---|
29 |
|
---|
30 | When processors are added, they are added alongside the existing processor given to each program.
|
---|
31 | Thus, for $N$ processors, allocate $N-1$ processors.
|
---|
32 | A thread is implicitly joined at deallocated, either implicitly at block exit for stack allocation or explicitly at @delete@ for heap allocation.
|
---|
33 | The thread performing the deallocation must wait for the thread to terminate before the deallocation can occur.
|
---|
34 | A thread terminates by returning from the main routine where it starts.
|
---|
35 |
|
---|
36 | % Local Variables: %
|
---|
37 | % tab-width: 4 %
|
---|
38 | % End: %
|
---|