2016-05-05 2 views
4

std::sync::atomic::AtomicUsize реализует Sync, что означает, что неизменяемые ссылки свободны от гонок данных при совместном использовании нескольких потоков. Почему AtomicUsize не реализован Send? Существует ли состояние, которое связано с нитью, создавшей атом, или это решение для языкового дизайна, связанное с тем, как атомические средства предназначены для использования, то есть через Arc<_> и т. Д.Почему AtomicUsize не реализует Send?

ответ

2

Это трюк! AtomicUsizeделает реализовать Send:

use std::sync::atomic::AtomicUsize; 

fn checker<T>(_: T) where T: Send {} 

fn main() { 
    checker(AtomicUsize::default()); 
} 

На самом деле, есть даже automated test that ensures this is the case.

Гоча заключается в том, как Send реализуется:

Эта черта автоматически выводится, когда компилятор определяет, что это необходимо.

Это означает, что Rustdoc не знает, что Send реализован для типа, потому что большинство типов не реализуют его явно.

Это объясняет, почему AtomicPtr<T> появляется в списке исполнителей. Он имеет специальную реализацию, которая игнорирует тип T.

Это не идеальный вариант, и об этом говорят несколько вопросов (1, 2).

Смежные вопросы