Короткая версия
Для передачи чего-либо в поток требуется, чтобы оно было Send
.
T:Send => Mutex<T>:Send+Sync => Arc<Mutex<T>>:Send
, поэтому достаточно пометить Api
как Send
Длинная версия
Для передачи чего-либо в поток требуется, чтобы оно было Send
.
Arc<T>
только автоматически получает Send
(и Sync
), если T
равно Send
и Sync
. Источник содержит что-то вроде этого:
unsafe impl<T: ?Sized + Sync + Send> Send for Arc<T> {}
unsafe impl<T: ?Sized + Sync + Send> Sync for Arc<T> {}
Однако для Mutex
требуется только Send
, чтобы оно было и Sync
, и Send
, его код содержит:
unsafe impl<T: ?Sized + Send> Send for Mutex<T> { }
unsafe impl<T: ?Sized + Send> Sync for Mutex<T> { }
Это означает, что Arc<Mutex<Api>>
должно быть Sync
, вам нужно Mutex<Api>
, чтобы быть Sync+Send
, что произойдет, если Api
будет Send
. Для этого вам нужно пометить Api
или OpaqWrapper
как Send
.
unsafe impl Send for Api {}
Обратите внимание, что вам не нужно отмечать их как Sync
, поскольку Mutex
получает это автоматически.