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()
の内側に返さ()
不満だと思います終わり?
もう一度Shepmaster!ありがとう。ロックフリーのデータ構造の周りにロックを置くことは、この点を打破します。私が使うことができる別の地図があるのだろうかと思う... –
@EddBarrettそれはやっかくなるだろう。 lazy_staticは実際には 'DerefMut'を実装していないので、変更可能なメソッドを呼び出すことができないので、あなたは' 'RefCell'か同等のものが必要です。ライブラリは通常の変数として使用されるように見えます。それが意味をなさないなら、メンテナーに尋ねる価値があります。 – Shepmaster