Awesome
cgo-channels
A quick program to explore the idea of sending data to a Go channel from C.
The program uses select
across two channels:
stringChannel
: this channel passes strings from C to Go.
messageChannel
: passes Message
data structures.
The publishMessage
takes a C Message (as defined in message.h
) and turns it into a Go Message
, then sends it over the messageChannel
.
This program makes use of cgo.
Usage
Fetch the repo:
% go get github.com/matiasinsaurralde/cgo-channels
Chdir somewhere (~
in this case) and build the program:
% cd ~
% go build github.com/matiasinsaurralde/cgo-channels
Run the program:
% ./cgo-channels
messageChannel receives: {[1 2 3]}
messageChannel receives: {[104 101 108 108 111 0 0 0]}
stringChannel receives: Hello from C
stringChannel receives: From Go!
stringChannel receives: Hello from C
stringChannel receives: From Go!
OpenMP support
I have included a very simple C program that uses OpenMP to parallelize the communication with Go channels, this has been tested under Linux and OSX.
There's a build tag that will include the right flags for each platform:
Linux
This command will include the OpenMP sample and -fopenmp
flag:
% go build github.com/matiasinsaurralde/cgo-channels -tags 'openmp'
Expected output:
% ./cgo-channels
stringChannel receives: Hello from C
messageChannel receives: {[1 2 3]}
stringChannel receives: From Go!
messageChannel receives: {[104 101 108 108 111 0 0 0]}
stringChannel receives: Hello from thread 0, nthreads 8
stringChannel receives: Hello from thread 3, nthreads 8
stringChannel receives: Hello from thread 6, nthreads 8
stringChannel receives: Hello from thread 4, nthreads 8
stringChannel receives: Hello from thread 7, nthreads 8
stringChannel receives: Hello from thread 2, nthreads 8
stringChannel receives: Hello from thread 5, nthreads 8
stringChannel receives: Hello from thread 1, nthreads 8
OSX
clang-omp
is a requirement, I installed it with:
% brew install clang-omp
You may find more details in its website.
We will need to override the default C compiler. To use clang-omp
and the openmp
build tag (for Go), run:
CC='clang-omp' go build -tags 'openmp'