# AsyncSemaphore

`import { AsyncSemaphore } from "destack:async";`

Asynchronous counting semaphore.

```ds title="AsyncSemaphore"
export class AsyncSemaphore {
    state: Atomic<isize>;
    constructor(permits: usize);
    get availablePermits(): usize;
    acquire(): Task<AsyncSemaphorePermit>;
    tryAcquire(): AsyncSemaphorePermit | undefined;
    acquireMany(count: usize): Task<AsyncSemaphorePermit>;
    tryAcquireMany(count: usize): AsyncSemaphorePermit | undefined;
    release(count?: usize): void;
}
```

[language/library/src/async/semaphore.ds:8:46](https://github.com/destack-sh/destack/blob/main/language/library/src/async/semaphore.ds#L8-L46)

## Members

### `state: Atomic<isize>`

The available permit count.

### `constructor(permits: usize)`

Create an async semaphore with `permits` available permits.

### `get availablePermits(): usize`

Return the number of immediately available permits.

### `acquire(): Task<AsyncSemaphorePermit>`

Acquire one permit by suspending the current task if needed.

### `tryAcquire(): AsyncSemaphorePermit | undefined`

Try to acquire one permit without suspending.

### `acquireMany(count: usize): Task<AsyncSemaphorePermit>`

Acquire `count` permits by suspending the current task if needed.

### `tryAcquireMany(count: usize): AsyncSemaphorePermit | undefined`

Try to acquire `count` permits without suspending.

### `release(count?: usize): void`

Release `count` permits.
