pub struct Semaphore { /* private fields */ }
Expand description
A Semaphore maintains the number of permits it is still allowed to give.
- When
acquire()
is called and the semaphore still has permits to give, it will return aPermit
. If there are no permits that can be given, it will wait for one permit to be given back from a thread so that it can return a newPermit
. - When
try_acquire()
is called and the semaphore still has permits to give, it will returnSome(Permit)
. If there are no permits that can be given, it will returnNone
.
Implementationsยง
sourceยงimpl Semaphore
impl Semaphore
sourcepub fn new(permits: usize) -> Arc<Self>
pub fn new(permits: usize) -> Arc<Self>
Returns a new Arc<Semaphore>
with the limit of permits chosen by you.
Examples found in repository?
examples/main.rs (line 7)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() {
let semaphore = simple_semaphore::Semaphore::new(2);
for _ in 0..5 {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
let permit = semaphore.acquire();
thread::sleep(Duration::from_millis(500));
drop(permit);
});
}
thread::sleep(Duration::from_millis(3000));
let cores = num_cpus::get();
let semaphore = simple_semaphore::Semaphore::default(); // Also uses `num_cpus::get()` internally
for _ in 0..(cores + 2) {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
if let Some(permit) = semaphore.try_acquire() {
thread::sleep(Duration::from_millis(500));
drop(permit);
} else {
println!("Too many permits given, exiting the thread"); // Will be printed twice
}
});
}
thread::sleep(Duration::from_millis((((cores + 1) * 1000) / 2) as u64));
}
sourcepub fn default() -> Arc<Self>
pub fn default() -> Arc<Self>
Returns a new Arc<Semaphore>
with the limit of permits set to the number of CPU cores the computer has.
Examples found in repository?
examples/main.rs (line 21)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() {
let semaphore = simple_semaphore::Semaphore::new(2);
for _ in 0..5 {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
let permit = semaphore.acquire();
thread::sleep(Duration::from_millis(500));
drop(permit);
});
}
thread::sleep(Duration::from_millis(3000));
let cores = num_cpus::get();
let semaphore = simple_semaphore::Semaphore::default(); // Also uses `num_cpus::get()` internally
for _ in 0..(cores + 2) {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
if let Some(permit) = semaphore.try_acquire() {
thread::sleep(Duration::from_millis(500));
drop(permit);
} else {
println!("Too many permits given, exiting the thread"); // Will be printed twice
}
});
}
thread::sleep(Duration::from_millis((((cores + 1) * 1000) / 2) as u64));
}
sourcepub fn acquire(self: &Arc<Self>) -> Permit
pub fn acquire(self: &Arc<Self>) -> Permit
Tries to get a Permit
. If no more permits can be given, it will wait for one permit to be given back from a thread so that it can return a new Permit
.
Examples found in repository?
examples/main.rs (line 12)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() {
let semaphore = simple_semaphore::Semaphore::new(2);
for _ in 0..5 {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
let permit = semaphore.acquire();
thread::sleep(Duration::from_millis(500));
drop(permit);
});
}
thread::sleep(Duration::from_millis(3000));
let cores = num_cpus::get();
let semaphore = simple_semaphore::Semaphore::default(); // Also uses `num_cpus::get()` internally
for _ in 0..(cores + 2) {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
if let Some(permit) = semaphore.try_acquire() {
thread::sleep(Duration::from_millis(500));
drop(permit);
} else {
println!("Too many permits given, exiting the thread"); // Will be printed twice
}
});
}
thread::sleep(Duration::from_millis((((cores + 1) * 1000) / 2) as u64));
}
sourcepub fn try_acquire(self: &Arc<Self>) -> Option<Permit>
pub fn try_acquire(self: &Arc<Self>) -> Option<Permit>
Tries to get a Option<Permit>
. If no more permits can be given, it will return None
.
Examples found in repository?
examples/main.rs (line 25)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() {
let semaphore = simple_semaphore::Semaphore::new(2);
for _ in 0..5 {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
let permit = semaphore.acquire();
thread::sleep(Duration::from_millis(500));
drop(permit);
});
}
thread::sleep(Duration::from_millis(3000));
let cores = num_cpus::get();
let semaphore = simple_semaphore::Semaphore::default(); // Also uses `num_cpus::get()` internally
for _ in 0..(cores + 2) {
let semaphore = Arc::clone(&semaphore);
thread::spawn(move || {
if let Some(permit) = semaphore.try_acquire() {
thread::sleep(Duration::from_millis(500));
drop(permit);
} else {
println!("Too many permits given, exiting the thread"); // Will be printed twice
}
});
}
thread::sleep(Duration::from_millis((((cores + 1) * 1000) / 2) as u64));
}
Auto Trait Implementationsยง
impl !Freeze for Semaphore
impl RefUnwindSafe for Semaphore
impl Send for Semaphore
impl Sync for Semaphore
impl Unpin for Semaphore
impl UnwindSafe for Semaphore
Blanket Implementationsยง
sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more