3. 스레드에서 외부 값 사용하기
스레드는 서로 독립적으로 실행되기 때문에 만약 다른 스레드의 값을 사용하려면 특별한 방법이 필요합니다.
스레드를 하나 만들고 스레드 외부인 main 스레드에 값을 만들어 새로 만든 스레드에서 그 값을 사용하는 코드를 작성하고 실행해 보겠습니다.
use std::thread;
fn main() {
let x = “hello".to_string(); // 1
thread::spawn(|| {
println!("thread1: {}", x); // 2
}).join().expect("fail!");
}
// 출력
...에러
6 | thread::spawn(|| {
| ^^ may outlive borrowed value `x`
7 | println!("thread1: {}", x);
| - `x` is borrowed here
|
note: function requires argument type to outlive `'static`
--> src/main.rs:6:5
|
6 | / thread::spawn(|| {
7 | | println!("thread1: {}", x);
8 | | }).join().expect("fail!");
| |______^
help: to force the closure to take ownership of `x` (and any other referenced variables), use the `move` keyword
|
6 | thread::spawn(move || {
| ++++
// 1: main 스레드에 변수 x가 정의 되어 있습니다.
// 2: 새로운 스레드 안에서 main 스레드의 변수 x를 사용하려고 합니다.
에러가 발생합니다. 에러 메시지의 help 부분을 보면 클로저가 변수 x의 소유권을 가지려면 “move” 키워드를 사용하라고 안내합니다.
친절하게 사용 법도 보여 줍니다.
thread::spawn(move || {
++++
안내대로 코드를 고쳐서 실행해 보겠습니다.
use std::thread;
fn main() {
let x = "hello".to_string();
thread::spawn(move || {
println!("thread1: {}", x);
}).join().expect("fail!");
}
// 출력
thread1: hello
제대로 실행 되는 것을 확인할 수 있습니다.
”move” 키워드는 스레드 외부 값의 소유권을 스레드에 넘겨주는 역할을 해서 스레드에서 외부 값을 사용할 수 있게 해 줍니다.
반응형
'Rust 입문' 카테고리의 다른 글
[Rust] Arc, Mutex (스레드의 데이터 공유) (0) | 2022.10.28 |
---|---|
[Rust] Message passing ( channel로 다른 스레드의 값 사용 하기 ) (0) | 2022.10.27 |
[Rust] 스레드 생성하기 (0) | 2022.10.25 |
[Rust] 동시성 (0) | 2022.10.24 |
[Rust] RefCell 그리고 Arc, Mutex (0) | 2022.10.23 |