chan
v0.0.4
GO 채널의 순수한 C 구현.
부패하지 않은 채널은 통신을위한 메커니즘과 동기화를 제공합니다. 데이터가 채널로 전송되면 발신자는 수신기가 준비 될 때까지 차단됩니다. 마찬가지로, 발신자가 준비 될 때까지 수신기가 차단됩니다.
#include <pthread.h>
#include <stdio.h>
#include "chan.h"
chan_t * chan ;
void * ping ()
{
// Send blocks until receiver is ready.
chan_send ( chan , "ping" );
return NULL ;
}
int main ()
{
// Initialize unbuffered channel.
chan = chan_init ( 0 );
pthread_t th ;
pthread_create ( & th , NULL , ping , NULL );
// Receive blocks until sender is ready.
void * msg ;
chan_recv ( chan , & msg );
printf ( "%sn" , msg );
// Clean up channel.
chan_dispose ( chan );
} 부패하지 않은 채널을 사용하면 발신자와 수신기가 동기화되므로 위의 프로그램은 ping 인쇄합니다.
버퍼링 된 채널은 해당 값에 대해 해당 수신기가없는 제한된 수의 값을 허용합니다. 채널이 가득 차면 데이터를 전송하는 것이 차단되지 않습니다. 채널이 비어있는 경우에만 데이터 수신이 차단됩니다.
#include <stdio.h>
#include "chan.h"
int main ()
{
// Initialize buffered channel with a capacity of 2.
chan_t * chan = chan_init ( 2 );
// Send up to 2 values without receiver.
chan_send ( chan , "buffered" );
chan_send ( chan , "channel" );
// Later receive the values.
void * msg ;
chan_recv ( chan , & msg );
printf ( "%sn" , msg );
chan_recv ( chan , & msg );
printf ( "%sn" , msg );
// Clean up channel.
chan_dispose ( chan );
} 위의 프로그램은 buffered 다음 channel 인쇄합니다. 채널의 용량은 2의 용량이기 때문에 보내지는데, 그 후에 더 많은 전송은 값을 수신 할 때까지 차단됩니다.
채널이 닫히면 더 이상 값을 전송할 수 없습니다. 닫힌 채널에서 수신하면 채널이 닫혔다는 표시 코드가 반환됩니다. 이것은 채널의 수신기에 완료를 전달하는 데 유용 할 수 있습니다. 닫힌 채널이 버퍼링되면 비어있을 때까지 값이 수신됩니다.
#include <pthread.h>
#include <stdint.h>
#include <stdio.h>
#include "chan.h"
chan_t * jobs ;
chan_t * done ;
void * worker ()
{
// Process jobs until channel is closed.
void * job ;
while ( chan_recv ( jobs , & job ) == 0 )
{
printf ( "received job %dn" , ( int ) job );
}
// Notify that all jobs were received.
printf ( "received all jobsn" );
chan_send ( done , "1" );
return NULL ;
}
int main ()
{
// Initialize channels.
jobs = chan_init ( 5 );
done = chan_init ( 0 );
pthread_t th ;
pthread_create ( & th , NULL , worker , NULL );
// Send 3 jobs over the jobs channel then close it.
int i ;
for ( i = 1 ; i <= 3 ; i ++ )
{
chan_send ( jobs , ( void * ) ( uintptr_t ) i );
printf ( "sent job %dn" , i );
}
chan_close ( jobs );
printf ( "sent all jobsn" );
// Wait for all jobs to be received.
chan_recv ( done , NULL );
// Clean up channels.
chan_dispose ( jobs );
chan_dispose ( done );
}이 프로그램은 다음과 같습니다.
sent job 1
received job 1
sent job 2
received job 2
sent job 3
received job 3
sent all jobs
received all jobs
선택 문서를 선택하십시오. 가능한 송신 또는 수신 작업이 진행되는 세트를 선택하십시오. 또한 비 블로킹 송신 및 수신을 수행하는 방법을 제공합니다. Select는 여러 채널을 통해 다중화 통신에 특히 유용합니다.
#include <stdio.h>
#include "chan.h"
chan_t * messages ;
chan_t * signals ;
int main ()
{
// Initialize channels.
messages = chan_init ( 0 );
signals = chan_init ( 0 );
void * msg ;
// This is a non-blocking receive. If a value is available on messages,
// select will take the messages (0) case with that value. If not, it will
// immediately take the default case.
switch ( chan_select ( & messages , 1 , & msg , NULL , 0 , NULL ))
{
case 0 :
printf ( "received message %sn" , msg );
break ;
default :
printf ( "no message receivedn" );
}
// A non-blocking send works similarly.
msg = "foo" ;
switch ( chan_select ( NULL , 0 , NULL , & messages , 1 , & msg ))
{
case 0 :
printf ( "sent message %sn" , msg );
break ;
default :
printf ( "no message sentn" );
}
// We can use multiple cases above the default clause to implement a
// multi-way non-blocking select. Here we attempt non-blocking receives on
// both messages and signals.
chan_t * chans [ 2 ] = { messages , signals };
switch ( chan_select ( chans , 2 , & msg , NULL , 0 , NULL ))
{
case 0 :
printf ( "received message %sn" , msg );
break ;
case 1 :
printf ( "received signal %sn" , msg );
break ;
default :
printf ( "no activityn" );
}
// Clean up channels.
chan_dispose ( messages );
chan_dispose ( signals );
}이 프로그램은 다음과 같습니다.
no message received
no message sent
no activity