gpt4 book ai didi

multithreading - 如何防止自动执行 Sync

转载 作者:行者123 更新时间:2023-11-29 07:58:43 25 4
gpt4 key购买 nike

我有一个包含不安全代码的结构,方法如下:

use std::sync::Arc;
use std::thread;

#[derive(Debug)]
struct Foo<T> {
items: Vec<Box<(T, String)>>,
}

impl<T> Foo<T> {
pub fn add_element(&self, element: T, key: String) {
if !(self.items.iter().any( |i| i.1 == key)) {
let mut items = unsafe {change_mut(&(self.items))};
items.push(Box::new((element,key)));
}
}
}

unsafe fn change_mut<T>(x: &T) -> &mut T { // changes &self to &mut self
&mut *(x as *const T as *mut T)
}

fn main() {
let foo = Arc::new(Foo { items: vec!() });
let clone = foo.clone();

// This should not be possible, as it might lead to UB
thread::spawn(move || clone.add_element(1, String::from("one")));

println!("{:?}", *foo);

}

这个结构是完全安全的,直到有人开始在多线程中使用这个方法。但是,由于该结构仅包含一个 Vec<Box<T,String>> , Sync默认情况下实现,我想阻止。

我找到了两种方法来做到这一点,这两种方法都不是很好......

  1. 添加一个不实现 Sync 的结构字段例如 *const u8 ,这显然是相当糟糕的,因为它最终会导致不必要和不清楚的代码,并且没有清楚地表明我的意图。

  2. impl !Sync for Struct {}在稳定版上不可用,将根据 this issue 删除.相应的错误告诉我改用标记类型,但是 the documention也没有提供解决我的问题的方法。


error: negative trait bounds are not yet fully implemented; use marker types for
now (see issue #13231)
--> src\holder.rs:44:1
|
44 | impl !Sync for Struct {}
| ^^^^^^^^^^^^^^^^^^^^^^^^

最佳答案

Rust 中的内部可变性需要1 使用 UnsafeCell 向编译器提示正常规则不适用

因此,您的结构应该如下所示:

#[derive(Debug)]
struct Foo<T> {
items: UnsafeCell<Vec<Box<(T, String)>>>,
}

然后,执行 add_element调整为:

impl<T> Foo<T> {
pub fn add_element(&self, element: T, key: String) {
if !(self.items.iter().any( |i| i.1 == key)) {
let mut items = unsafe { &mut *self.items.get() };
// ^~~~~~~~~~~~~~~~~~~~~~
items.push(Box::new((element,key)));
}
}
}

UnsafeCell的使用使 change_mut完全没有必要:这是 UnsafeCell 的目的,毕竟,允许内部可变性。注意它是如何 get方法返回一个原始指针,如果没有 unsafe 就不能解除引用。 block 。


UnsafeCell不执行 Sync , Foo<T>不会实现 Sync两者都可以,因此无需使用否定实现或任何标记。


1 如果您不直接使用它,您使用的抽象很可能是建立在它之上的。它尽可能特别:它是一个 lang 项,由其属性 #[lang = "unsafe_cell"] 表示.

关于multithreading - 如何防止自动执行 Sync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45391874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com