# Chapter 16.1 (only) - Fearless Concurrency Problems writing multithreaded code: * Race conditions, where threads are accessing data or resources in an inconsistent order * Deadlocks, where two threads are waiting for each other to finish using a resource the other thread has, preventing both threads from continuing This model where a language calls the operating system APIs to create threads is sometimes called 1:1, meaning one operating system thread per one language thread. Programming language-provided threads are known as green threads, and languages that use these green threads will execute them in the context of a different number of operating system threads. For this reason, the green-threaded model is called the M:N model: there are M green threads per N operating system threads, where M and N are not necessarily the same number. Rust standard library only provides an implementation of 1:1 threading. But there are various libraries which provides M:N model. ## Thread Primitives * spawn * join ``` rust use std::thread; use std::time::Duration; fn main() { let handle = thread::spawn(|| { for i in 1..10 { println!("hi number {} from the spawned thread!", i); thread::sleep(Duration::from_millis(1)); } }); for i in 1..5 { println!("hi number {} from the main thread!", i); thread::sleep(Duration::from_millis(1)); } handle.join().unwrap(); } ``` You will use the `move` keyword to make the closure take ownership of the values in threads: ``` rust use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(move || { println!("Here's a vector: {:?}", v); }); handle.join().unwrap(); } ``` The above code won't work without using `move` as you can very well write invalid code like this: ``` rust use std::thread; fn main() { let v = vec![1, 2, 3]; let handle = thread::spawn(|| { println!("Here's a vector: {:?}", v); }); drop(v); // oh no! handle.join().unwrap(); } ```