gpt4 book ai didi

multithreading - 我可以定义一个特征,其实现必须是 `!Send` 吗?

转载 作者:行者123 更新时间:2023-11-29 08:15:56 24 4
gpt4 key购买 nike

我想定义一个特征,强制其实现者在任何情况下都不能发送到线程或在线程之间共享。将特征标记为 !Send 应该就足够了,但 Rust 似乎不允许我这么做。

这可能吗?

示例(playground):

#![feature(optin_builtin_traits)]

// This is a syntax error
//trait ThreadThing : !Send {}

// This doesn't work either
trait ThreadThing { }
impl !Send for ThreadThing {}

最佳答案

不,您不能使 !Send 成为 ThreadThing 的条件。编译器只是不支持这种逻辑。

如果某人使用您的 crate 可以生成隐式 Send 的类型,在其实现中的任何地方都不包含不安全代码,并且 make它不安全 只是通过为它实现 ThreadThing —— 在那种情况下,你可以使 ThreadThing 成为 unsafe trait表明某处存在依赖于类型系统中无法描述的不变量的不安全代码:不变的“Things that are Send do not implement ThreadThing ".

如果更有可能的是,为实现了 ThreadThing 的类型手动实现 Send 是不安全的——在这种情况下,您不需要这样做任何事情,因为 manually implementing Send is unsafe already .如果 ThreadThing 的实现者决定手动实现 Send,他们不仅要承担保证自己不变量的责任,还要承担 ThreadThing 的不变量责任.

关于multithreading - 我可以定义一个特征,其实现必须是 `!Send` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492087/

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