rust-concurrency - 評価

評価スケール

基本評価 (100点満点)

項目 配点 評価基準
コンパイル 10点 `cargo build` エラーなし
Counter 25点 スレッドセーフ
チャネル処理 25点 正しいメッセージング
ThreadPool 25点 動作の正確性
テスト 10点 並行性テスト
データ競合なし 5点 MIRI検査パス

ボーナス評価 (最大30点)

項目 配点
バリア同期 10点
RwLock 10点
アトミック 10点

課題の目的

学習目標

  • Rustの並行性保証
- 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 でエラーなし(推奨)