C++ Channel
Loading...
Searching...
No Matches
Channel

build codecov documentation

‍Thread-safe container for sharing data between threads (synchronized queue). Header-only. Compatible with C++11 and newer.

About

msd::channel

  • A synchronized queue that can be easily and safely shared between multiple threads.
  • Tested with GCC, Clang, and MSVC.
  • Uses std::mutex for synchronization.
  • Uses a customizable storage to store elements.

It's a class that can be constructed in several ways:

A storage is:

  • A class with a specific interface for storing elements.
  • Must implement FIFO logic.
  • See built-in storages.

Exceptions:

Features

  • Thread-safe push and fetch.
  • Use stream operators to push (<<) and fetch (>>) items.
  • Value type must be default constructible, move constructible, move assignable, and destructible.
  • Blocking (forever waiting to fetch).
  • Range-based for loop supported.
  • Close to prevent pushing and stop waiting to fetch.
  • Integrates with some of the STL algorithms. Eg:
    • std::move(ch.begin(), ch.end(), ...)
    • std::transform(input_chan.begin(), input_chan.end(), msd::back_inserter(output_chan)).
    • std::copy_if(chan.begin(), chan.end(), ...);

Installation

Choose one of the methods:

VERSION=X.Y.Z \
&& wget https://github.com/andreiavrammsd/cpp-channel/archive/refs/tags/v$VERSION.zip \
&& unzip v$VERSION.zip \
&& cd cpp-channel-$VERSION \
&& mkdir build && cd build \
&& cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local \
&& sudo cmake --install .

Usage

// Unbuffered channel
#include <msd/channel.hpp>
int main()
{
chan << 1 << 2; // Send
int first_value{};
int second_value{};
chan >> first_value >> second_value; // Receive
chan.read(first_value); // Returns channel close status (true/false), blocks thread when channel is empty
}
Thread-safe container for sharing data between threads.
Definition channel.hpp:87
bool read(T &out)
Pops an element from the channel.
Definition channel.hpp:190
// Buffered channel with custom storage
#include <msd/channel.hpp>
int main()
{
chan << 1; // Throws if channel is closed
chan.write(2); // Non-throwing write, returns channel close status (true/false)
chan << 3; // Blocks thread (no space, no reader)
}
bool write(Type &&value)
Pushes an element into the channel.
Definition channel.hpp:165
// Range-based iteration
#include <msd/channel.hpp>
#include <iostream>
int main()
{
chan << 1 << 2;
for (int value : chan) {
if (chan.closed()) {
// You can break before it's empty
break;
}
std::cout << value << '\n'; // Blocks thread until there is data to read or channel is closed and empty
}
}
NODISCARD bool closed() const noexcept
Checks if the channel has been closed.
Definition channel.hpp:249
// Channel with statically-allocated storage (always buffered)
#include <algorithm>
int main()
{
src.write(1);
src.write(2);
src.close();
std::copy_if(src.begin(), src.end(), msd::back_inserter(dst), [](int value) { return value % 2 == 0; });
dst.size(); // 1
}
void close() noexcept
Closes the channel, no longer accepting new elements.
Definition channel.hpp:234

See examples and tests. Read the documentation for full API reference.

Known limitations

  • In some cases, the integration with some STL algorithms does not compile with MSVC. See the Transform test.

Developed with CLion and Visual Studio Code.