Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/andreiavrammsd/cpp-channel

Thread-safe container for sharing data between threads
https://github.com/andreiavrammsd/cpp-channel

channel concurrent-queue cpp multithreading queue synchronized-queue thread-safe thread-safe-queue

Last synced: 5 days ago
JSON representation

Thread-safe container for sharing data between threads

Awesome Lists containing this project

README

        

# Channel

[![build](https://github.com/andreiavrammsd/cpp-channel/workflows/build/badge.svg)](https://github.com/andreiavrammsd/cpp-channel/actions)

[![codecov](https://codecov.io/github/andreiavrammsd/cpp-channel/graph/badge.svg?token=CKQ0TVW62Z)](https://codecov.io/github/andreiavrammsd/cpp-channel)

### Thread-safe container for sharing data between threads. Header-only.

* Thread-safe push and fetch.
* Use stream operators to push (<<) and fetch (>>) items.
* Value type must be default constructible.
* Blocking (forever waiting to fetch).
* Range-based for loop supported.
* Close to prevent pushing and stop waiting to fetch.
* Integrates well with STL algorithms in some cases. Eg: std::move(ch.begin(), ch.end(), ...).
* Tested with GCC, Clang, and MSVC.

## Requirements

* C++11 or newer

## Installation

Copy the [include](./include) directory to your project and add it to your include path. Or
see [CMakeLists.txt](./examples/cmake-project/CMakeLists.txt) from the [CMake project example](./examples/cmake-project)
.

## Usage

```c++
#include

#include

int main() {
msd::channel chan; // unbuffered

int in = 1;
int out = 0;

// Send to channel
chan << in;

// Read from channel
chan >> out;

assert(out == 1);
}
```

```c++
#include

int main() {
msd::channel chan{2}; // buffered

// Send to channel
chan << 1;
chan << 2;
chan << 3; // blocking because capacity is 2 (and no one reads from channel)
}
```

```c++
#include

int main() {
msd::channel chan{2}; // buffered

int in = 1;
int out = 0;

// Send to channel
chan << in;
chan << in;

// Read from channel
chan >> out;
chan >> out;
chan >> out; // blocking because channel is empty (and no one writes on it)
}
```

```c++
#include

#include

int main() {
msd::channel chan;

int in1 = 1;
int in2 = 2;

chan << in1 << in2;

for (const auto out : chan) { // blocking: forever waiting for channel items
std::cout << out << '\n';
}
}
```

See [examples](examples).


Developed with [CLion](https://www.jetbrains.com/?from=serializer)

![JetBrains](jetbrains.svg)