2017-12-14 13 views
1

Rustプログラムのすべてのスレッドにわたって、ロックフリーの、最終的に一貫した複数値マップであるevmapを共有したいと思います。`lazy_static`の中で` evmap`を使うことはできますか?

単純に、それは次のようになります。

#[macro_use] 
extern crate lazy_static; 

extern crate evmap; 

use std::collections::hash_map::RandomState; 

lazy_static! { 
    static ref MAP: (evmap::ReadHandle<u32, u32,(), RandomState>, 
        evmap::WriteHandle<u32, u32,(), RandomState>) = evmap::new(); 
} 

fn main() { 
    println!("Hello, world!"); 
    MAP.1.clear(); 
} 

これが与える:

pub fn new<K, V>(
) -> (ReadHandle<K, V,(), RandomState>, WriteHandle<K, V,(), RandomState>) where 
    K: Eq + Hash + Clone, 
    V: Eq + ShallowCopy, 

それをすることができ:

error[E0277]: the trait bound `std::cell::Cell<()>: std::marker::Sync` is not satisfied in `(evmap::ReadHandle<u32, u32>, evmap::WriteHandle<u32, u32>)` 
    --> src/main.rs:8:1 
    | 
8 |/lazy_static! { 
9 | |  static ref MAP: (evmap::ReadHandle<u32, u32,(), RandomState>, 
10 | |      evmap::WriteHandle<u32, u32,(), RandomState>) = evmap::new(); 
11 | | } 
    | |_^ `std::cell::Cell<()>` cannot be shared between threads safely 
    | 
    = help: within `(evmap::ReadHandle<u32, u32>, evmap::WriteHandle<u32, u32>)`, the trait `std::marker::Sync` is not implemented for `std::cell::Cell<()>` 
    = note: required because it appears within the type `std::marker::PhantomData<std::cell::Cell<()>>` 
    = note: required because it appears within the type `evmap::ReadHandle<u32, u32>` 
    = note: required because it appears within the type `(evmap::ReadHandle<u32, u32>, evmap::WriteHandle<u32, u32>)` 
    = note: required by `lazy_static::lazy::Lazy` 
    = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) 

私はこれがevmap::new()の内側に返さ()不満だと思います終わり?

答えて

1

[ReadHandle/WriteHandleをレイジー静的変数に直接配置する]を実行できますか?

いいえ。エラーメッセージが述べたよう:

std::cell::Cell<()>は、あなたはスレッドでなければならない静的変数、マルチスレッドコンテキストで使用した場合に失敗しますタイプを配置しようとしている安全に

スレッド間で共有することができません-安全。

[ReadHandle/WriteHandleを遅延静的変数に設定する]を実行できますか?

はいが、あなたは、このようなMutexRwLockとして、アクセスを同期するために何かを使用する必要があります。

#[macro_use] 
extern crate lazy_static; 

extern crate evmap; 

use std::collections::hash_map::RandomState; 
use std::sync::Mutex; 

type ReadHandle = evmap::ReadHandle<u32, u32,(), RandomState>; 
type WriteHandle = evmap::WriteHandle<u32, u32,(), RandomState>; 

lazy_static! { 
    static ref MAP: (Mutex<ReadHandle>, Mutex<WriteHandle>) = { 
     let (r, w) = evmap::new(); 
     (Mutex::new(r), Mutex::new(w)) 
    }; 
} 

fn main() { 
    MAP.1.lock().unwrap().clear(1); 
} 

も参照してください:

+0

もう一度Shepmaster!ありがとう。ロックフリーのデータ構造の周りにロックを置くことは、この点を打破します。私が使うことができる別の地図があるのだろうかと思う... –

+0

@EddBarrettそれはやっかくなるだろう。 lazy_staticは実際には 'DerefMut'を実装していないので、変更可能なメソッドを呼び出すことができないので、あなたは' 'RefCell'か同等のものが必要です。ライブラリは通常の変数として使用されるように見えます。それが意味をなさないなら、メンテナーに尋ねる価値があります。 – Shepmaster

関連する問題