[T] здесь фактически нулевая возможность для обоих потоков одновременно обращаться к refcounter.
Но компилятор не может этого понять, так что у вас естьсказать "нет на самом деле, поверь мне, я знаю, это выглядит глупо, но это на самом деле безопасно".Вот для чего unsafe
.
Это должно быть так просто, как
unsafe impl Send for Foo {}
От Nomicon :
Rc
не является отправкой или синхронизацией (потому что refcount является общим и несинхронизированным).
Не безопасно делать Rc
сам Send
, потому что Rc
выставляетинтерфейс, который был бы небезопасен, если бы пересылался между потокамиНо Foo
, как вы его описываете, предоставляет интерфейс, который не небезопасен для отправки между потоками, так что просто unsafe impl
это и будет на вашем пути.
Предполагая, чтоявляется то, что интерфейс является безопасным для отправки между потоками.Foo
не может иметь метод, который клонирует и возвращает внутренний Rc
, например (потому что вы могли бы использовать его, чтобы эффективно "переправить" голое Rc
в другой поток через Foo
).
Если Foo
не всегда безопасно для отправки, но вы знаете, что некоторые определенные Foo
безопасны для отправки, лучше было бы временно обернуть ихв типе, который Send
, как ответ Шепмастера предлагает.