세마포어란?
복수의 제한된 자원에 다수의 스레드가 동시에 접근하는 것을 막는 동시성 제어 방법
여러 스레드가 동시에 세마포어에 접근할 수 있도록 Arc<T> 를 사용한다.
세마포어는 임계 지정을 직접 지정해야 한다.
세마포어를 사용하려면 tokio 크레이트를 사용해야 한다.
cargo.toml 에 다음과 같이 의존성 추가 한다.
[dependencies]
tokio = { version = "1.25.0", features = ["full"] }
use std::sync::{Arc, Mutex};
use tokio::sync::Semaphore;
// 공유 카운터를 위한 뮤텍스
static counter: Mutex<i32> = Mutex::new(0);
#[tokio::main]
async fn main() {
// 동시에 2개의 thread가 접근 가능하도록 세마포어 설정
let semaphore = Arc::new(Semaphore::new(2));
let mut future_vec = vec![];
for _ in 0..100 {
// semaphore 획득
let permit = semaphore.clone().acquire_owned().await.unwrap();
let future = tokio::spawn(async move {
//뮤텍스로부터 안전한 참조 획득
let mut num = counter.lock().unwrap();
*num = *num + 1; //카운터 증가
drop(permit); // semaphore 해제
});
future_vec.push(future); //생성된 future를 벡터에 저장
}
for future in future_vec {
future.await.unwrap(); //모든 future가 완료될 때까지 대기
}
println!("결과: {}", *counter.lock().unwrap()); //최종 결과 출력
}
/*실행결과
결과: 100
*/
댓글 없음:
댓글 쓰기