Repository navigation
Immutable reference to ArrayRef is not Sync #1569
Copy link
Copy link
Closed
Description
I am writing a code for feature tracking in rust and I would like to parallelize my code over the features. For this I need to have the images shared across the threads, however I cannot do so when the type of the images are &ArrayRef2, however it works if the type of the images are &ArrayBase<S, Ix2> with the required trait bounds .
Below is a minimal reproducible example:
use ndarray::{ArrayBase, ArrayRef2, Data, Ix2, ScalarOperand, Zip, arr2};
use num_traits::{Float, FromPrimitive};
// Fails to compile
pub fn track_level<A>(
image_host: &ArrayRef2<A>,
image_target: &ArrayRef2<A>,
keypoints_host: &ArrayRef2<A>,
keypoints_target: &mut ArrayRef2<A>
)
where
A: Float + Send + Sync + ScalarOperand + FromPrimitive
{
Zip::from(keypoints_host.rows()).and(keypoints_target.rows_mut()).par_for_each(
|kp_host, mut kp_target|
{
let t = arr2(&[[image_host.mean().unwrap()], [image_target.mean().unwrap()]]);
kp_target.assign(&(&kp_host + &t));
}
);
}
// Compiles succesfully
pub fn track_level_array_base<A, SH, ST>(
image_host: &ArrayBase<SH, Ix2>,
image_target: &ArrayBase<ST, Ix2>,
keypoints_host: &ArrayRef2<A>,
keypoints_target: &mut ArrayRef2<A>
)
where
A: Float + Send + Sync + ScalarOperand + FromPrimitive,
SH: Data<Elem = A> + Send + Sync,
ST: Data<Elem = A> + Send + Sync
{
Zip::from(keypoints_host.rows()).and(keypoints_target.rows_mut()).par_for_each(
|kp_host, mut kp_target|
{
let t = arr2(&[[image_host.mean().unwrap()], [image_target.mean().unwrap()]]);
kp_target.assign(&(&kp_host + &t));
}
);
}The compiler error I get is the following:
error[E0277]: `NonNull<A>` cannot be shared between threads safely
--> src/patch_tracker/test.rs:16:9
|
15 | Zip::from(keypoints_host.rows()).and(keypoints_target.rows_mut()).par_for_each(
| ------------ required by a bound introduced by this call
16 | |kp_host, mut kp_target|
| ^-----------------------
| |
| _________within this `{closure@src/patch_tracker/test.rs:16:9: 16:33}`
| |
17 | | {
18 | | let t = arr2(&[[image_host.mean().unwrap()], [image_target.mean().unwrap()]]);
19 | | kp_target.assign(&(&kp_host + &t));
20 | | }
| |_________^ `NonNull<A>` cannot be shared between threads safely
|
= help: within `{closure@src/patch_tracker/test.rs:16:9: 16:33}`, the trait `Sync` is not implemented for `NonNull<A>`
Is this an expected behavior ?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels
Activity
nilgoyette commentedon Jan 5, 2026
This bug has been fixed last month in this PR so you just have to wait until the next release (or use the master branch).