rust-concurrency - 評価
評価スケール
基本評価 (100点満点)
| 項目 |
配点 |
評価基準 |
| コンパイル |
10点 |
`cargo build` エラーなし |
| Counter |
25点 |
スレッドセーフ |
| チャネル処理 |
25点 |
正しいメッセージング |
| ThreadPool |
25点 |
動作の正確性 |
| テスト |
10点 |
並行性テスト |
| データ競合なし |
5点 |
MIRI検査パス |
ボーナス評価 (最大30点)
| 項目 |
配点 |
| バリア同期 |
10点 |
| RwLock |
10点 |
| アトミック |
10点 |
課題の目的
学習目標
- Send / Sync トレイト
- データ競合の防止 - Mutex, RwLock
- Condvar, Barrier - チャネルの使用
- 所有権の転送習得スキル
- スレッドセーフなコード設計
- デッドロックの回避
- 並行処理のデバッグ
評価手順
1. スレッドセーフテスト
#[test]
fn test_counter_concurrent() {
let counter = Counter::new();
let handles: Vec<_> = (0..100).map(|_| {
let c = counter.clone();
thread::spawn(move || {
for _ in 0..1000 {
c.increment();
}
})
}).collect();
for h in handles { h.join().unwrap(); }
assert_eq!(counter.get(), 100_000);
}
2. チャネルテスト
#[test]
fn test_spawn_workers() {
let items: Vec<i32> = (0..100).collect();
let results = spawn_workers(items, 4, |x| x * 2);
assert_eq!(results.len(), 100);
assert!(results.contains(&0));
assert!(results.contains(&198));
}
3. ThreadPool テスト
#[test]
fn test_thread_pool() {
let pool = ThreadPool::new(4);
let counter = Arc::new(AtomicUsize::new(0));
for _ in 0..100 {
let c = counter.clone();
pool.execute(move || {
c.fetch_add(1, Ordering::SeqCst);
});
}
thread::sleep(Duration::from_millis(100));
assert_eq!(counter.load(Ordering::SeqCst), 100);
}
減点対象
| 項目 |
減点 |
| データ競合 |
-30点 |
| デッドロック可能性 |
-20点 |
| 不適切なロック |
-10点 |
| panic未処理 |
-5点 |
合格基準
マンダトリーパート: 80点以上
並行テストが安定してパス
cargo +nightly miri test でエラーなし(推奨)