Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ahorn/cpp-channel
Experimental Go-style concurrency for C++11
https://github.com/ahorn/cpp-channel
Last synced: 18 days ago
JSON representation
Experimental Go-style concurrency for C++11
- Host: GitHub
- URL: https://github.com/ahorn/cpp-channel
- Owner: ahorn
- License: other
- Created: 2014-01-27T23:48:45.000Z (almost 11 years ago)
- Default Branch: master
- Last Pushed: 2015-01-23T14:28:53.000Z (almost 10 years ago)
- Last Synced: 2024-07-31T22:53:52.159Z (3 months ago)
- Language: C++
- Homepage:
- Size: 1.21 MB
- Stars: 152
- Watchers: 9
- Forks: 20
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# cpp-channel
Go-style concurrency for C++11
## Getting started
To use the library, `#include `. Here's an example:
```C++
void thread_a(cpp::channel c) {
c.send('A');
char r = c.recv();assert('B' == r);
}void thread_b(cpp::channel c) {
char r = c.recv();
c.send('B');assert('A' == r);
}int main() {
cpp::channel c;std::thread a(thread_a, c);
std::thread b(thread_b, c);a.join();
b.join();return EXIT_SUCCESS;
}
```As in Go, `cpp::channel` are first-class values. In particular,
channel `c` in the example is passed by value to the newly created threads.The [source code repository][test] contains several more examples including
the most standard one of them all, Dijkstra's dining philosophers. In fact,
it also shows the use of `std::ref` for a `dining_table` struct as these
are typically not passed by value.[test]: https://github.com/ahorn/cpp-channel/blob/master/test/channel_test.cpp
## Documentation
A `cpp::channel` is like a Go channel created with `make(chan T, N)`.
If `N` is zero, the channel is synchronous; otherwise, it is asynchronous,
as documented in the Go language specification:* http://golang.org/ref/spec#Channel_types
* http://golang.org/ref/spec#Send_statements
* http://golang.org/ref/spec#Receive_operatorBut to simplify the library usage, `cpp::channel` cannot be nil nor closed.
Similar to Go, there are `cpp::ichannel` and `cpp::ochannel` that
can only receive and send elements of type T, respectively.Noteworthy, channels are first-class values. Consequently, we can have
[channels of channels][chan-of-chan].[chan-of-chan]: http://golang.org/doc/effective_go.html#chan_of_chan
## Installation
You only need a C++11-compliant compiler. There are no other external
dependencies.To build the library on a (mostly) POSIX-compliant operating system,
execute the following commands from the `cpp-channel` directory:$ ./autogen.sh
$ ./configure
$ make
$ make test
$ make installIf `make test` fails, you can still install, but it is likely that some
features of this library will not work correctly on your system.
Proceed at your own risk.Note that `make install` may require superuser privileges.
The troubleshooting section below has a few additional tips. For advanced
configuration options refer to the [Autoconf documentation][autoconf].[autoconf]: http://www.gnu.org/software/autoconf/
## Troubleshooting
If `make test` fails with an error that indicates that `libstdc++.so.6`
or a specific version of `GLIBCXX` cannot be found, then check out GCC's
[FAQ][libstdcxx-faq].[libstdcxx-faq]: http://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.how_to_set_paths
## Bug Reports
You are warmly invited to submit patches as Github pull request,
formatted according to the existing coding style.