Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sync: add Barrier primitive #1571

Merged
merged 12 commits into from
Sep 19, 2019
Merged

sync: add Barrier primitive #1571

merged 12 commits into from
Sep 19, 2019

Conversation

jonhoo
Copy link
Sponsor Contributor

@jonhoo jonhoo commented Sep 18, 2019

This adds Barrier to tokio-sync, which is an asynchronous alternative to std::sync::Barrier. It is a synchronization primitive that allows multiple futures to "rendezvous" at certain points in their execution. An example execution might look like this (included in the docs):

use std::sync::Arc;
use tokio_sync::Barrier;
use futures_util::future::join_all;

let mut handles = Vec::with_capacity(10);
let barrier = Arc::new(Barrier::new(10));
for _ in 0..10 {
    let c = barrier.clone();
    // The same messages will be printed together.
    // You will NOT see any interleaving.
    handles.push(async move {
        println!("before wait");
        let wr = c.wait().await;
        println!("after wait");
        wr
    });
}
// Will not resolve until all "before wait" messages have been printed
let wrs = join_all(handles).await;
// Exactly one barrier will resolve as the "leader"
assert_eq!(wrs.into_iter().filter(|wr| wr.is_leader()).count(), 1);

So that `rustfmt` works correctly (`cargo fmt` doesn't need this).
Copy link
Member

@carllerche carllerche left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM modulo the n == 0 question.

Thanks 👍

@jonhoo jonhoo merged commit 613fde2 into master Sep 19, 2019
@jonhoo jonhoo deleted the jonhoo/sync-barrier branch September 19, 2019 18:17
dignifiedquire added a commit to dignifiedquire/async-std that referenced this pull request Sep 25, 2019
Based on the implementation in tokio-rs/tokio#1571
dignifiedquire added a commit to dignifiedquire/async-std that referenced this pull request Sep 25, 2019
Based on the implementation in tokio-rs/tokio#1571
bors bot added a commit to async-rs/async-std that referenced this pull request Sep 26, 2019
240: feat: implement sync::Barrier r=yoshuawuyts a=dignifiedquire

~~Based on the implementation in tokio-rs/tokio#1571

Based on the implementation in the std lib 

Things to discuss

- `async` or `std` `Arc` in examples and tests
- ~~`async` or `std` `Mutex` in the implementation~~ can't use std, as it needs to be shared
- use of `broadcaster` dependency to implement, well broadcast

To fix
- [x] missing debug implementation, once broadcaster has it, or it is dropped

## Docs

![Screenshot 2019-09-25 at 21 07 25](https://user-images.githubusercontent.com/790842/65631833-a541e580-dfd8-11e9-970b-8a1df9155529.png)


Co-authored-by: dignifiedquire <dignifiedquire@users.noreply.github.com>
bors bot added a commit to async-rs/async-std that referenced this pull request Sep 26, 2019
240: feat: implement sync::Barrier r=yoshuawuyts a=dignifiedquire

~~Based on the implementation in tokio-rs/tokio#1571

Based on the implementation in the std lib 

Things to discuss

- `async` or `std` `Arc` in examples and tests
- ~~`async` or `std` `Mutex` in the implementation~~ can't use std, as it needs to be shared
- use of `broadcaster` dependency to implement, well broadcast

To fix
- [x] missing debug implementation, once broadcaster has it, or it is dropped

## Docs

![Screenshot 2019-09-25 at 21 07 25](https://user-images.githubusercontent.com/790842/65631833-a541e580-dfd8-11e9-970b-8a1df9155529.png)


Co-authored-by: dignifiedquire <dignifiedquire@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants