# include <stdio.h>
# include <pthread.h>
# define BufferSize 10
void * Producer( ) ;
void * Consumer( ) ;
int BufferIndex= 0 ;
char * BUFFER;
pthread_cond_t Buffer_Not_Full= PTHREAD_COND_INITIALIZER;
pthread_cond_t Buffer_Not_Empty= PTHREAD_COND_INITIALIZER;
pthread_mutex_t mVar= PTHREAD_MUTEX_INITIALIZER;
int main( )
{
pthread_t ptid,ctid;
BUFFER= ( char * ) malloc ( sizeof ( char ) * BufferSize) ;
pthread_create( & ptid,NULL ,Producer,NULL ) ;
pthread_create( & ctid,NULL ,Consumer,NULL ) ;
pthread_join( ptid,NULL ) ;
pthread_join( ctid,NULL ) ;
return 0 ;
}
void * Producer( )
{
for ( ;; )
{
pthread_mutex_lock( & mVar) ;
if ( BufferIndex== BufferSize)
{
pthread_cond_wait( & Buffer_Not_Full,& mVar) ;
}
BUFFER[ BufferIndex++ ] = '@' ;
printf ( "Produce : %d \n " ,BufferIndex) ;
pthread_mutex_unlock( & mVar) ;
pthread_cond_signal( & Buffer_Not_Empty) ;
}
}
void * Consumer( )
{
for ( ;; )
{
pthread_mutex_lock( & mVar) ;
if ( BufferIndex== - 1 )
{
pthread_cond_wait( & Buffer_Not_Empty,& mVar) ;
}
printf ( "Consume : %d \n " ,BufferIndex-- ) ;
pthread_mutex_unlock( & mVar) ;
pthread_cond_signal( & Buffer_Not_Full) ;
}
}
IyBpbmNsdWRlIDxzdGRpby5oPgojIGluY2x1ZGUgPHB0aHJlYWQuaD4KIyBkZWZpbmUgQnVmZmVyU2l6ZSAxMAoKdm9pZCAqUHJvZHVjZXIoKTsKdm9pZCAqQ29uc3VtZXIoKTsKCmludCBCdWZmZXJJbmRleD0wOwpjaGFyICpCVUZGRVI7CgpwdGhyZWFkX2NvbmRfdCBCdWZmZXJfTm90X0Z1bGw9UFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOwpwdGhyZWFkX2NvbmRfdCBCdWZmZXJfTm90X0VtcHR5PVBUSFJFQURfQ09ORF9JTklUSUFMSVpFUjsKcHRocmVhZF9tdXRleF90IG1WYXI9UFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKCmludCBtYWluKCkKeyAgICAKICAgIHB0aHJlYWRfdCBwdGlkLGN0aWQ7CiAgICAKICAgIEJVRkZFUj0oY2hhciAqKSBtYWxsb2Moc2l6ZW9mKGNoYXIpICogQnVmZmVyU2l6ZSk7ICAgICAgICAgICAgCiAgICAKICAgIHB0aHJlYWRfY3JlYXRlKCZwdGlkLE5VTEwsUHJvZHVjZXIsTlVMTCk7CiAgICBwdGhyZWFkX2NyZWF0ZSgmY3RpZCxOVUxMLENvbnN1bWVyLE5VTEwpOwogICAgCiAgICBwdGhyZWFkX2pvaW4ocHRpZCxOVUxMKTsKICAgIHB0aHJlYWRfam9pbihjdGlkLE5VTEwpOwogICAgICAgIAogICAgCiAgICByZXR1cm4gMDsKfQoKdm9pZCAqUHJvZHVjZXIoKQp7ICAgIAogICAgZm9yKDs7KQogICAgewogICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbVZhcik7CiAgICAgICAgaWYoQnVmZmVySW5kZXg9PUJ1ZmZlclNpemUpCiAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmQnVmZmVyX05vdF9GdWxsLCZtVmFyKTsKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgQlVGRkVSW0J1ZmZlckluZGV4KytdPSdAJzsKICAgICAgICBwcmludGYoIlByb2R1Y2UgOiAlZCBcbiIsQnVmZmVySW5kZXgpOwogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtVmFyKTsKICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZCdWZmZXJfTm90X0VtcHR5KTsgICAgICAgIAogICAgfSAgICAKICAgIAp9Cgp2b2lkICpDb25zdW1lcigpCnsKICAgIGZvcig7OykKICAgIHsKICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1WYXIpOwogICAgICAgIGlmKEJ1ZmZlckluZGV4PT0tMSkKICAgICAgICB7ICAgICAgICAgICAgCiAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZCdWZmZXJfTm90X0VtcHR5LCZtVmFyKTsKICAgICAgICB9ICAgICAgICAgICAgICAgIAogICAgICAgIHByaW50ZigiQ29uc3VtZSA6ICVkIFxuIixCdWZmZXJJbmRleC0tKTsgICAgICAgIAogICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtVmFyKTsgICAgICAgIAogICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJkJ1ZmZlcl9Ob3RfRnVsbCk7ICAgICAgICAgICAgICAgIAogICAgfSAgICAKfQ==
compilation info
prog.cpp: In function 'int main()':
prog.cpp:19:53: error: 'malloc' was not declared in this scope
BUFFER=(char *) malloc(sizeof(char) * BufferSize);
^
prog.cpp:21:44: error: invalid conversion from 'void* (*)()' to 'void* (*)(void*)' [-fpermissive]
pthread_create(&ptid,NULL,Producer,NULL);
^
In file included from prog.cpp:2:0:
/usr/include/pthread.h:244:12: note: initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)'
extern int pthread_create (pthread_t *__restrict __newthread,
^
prog.cpp:22:44: error: invalid conversion from 'void* (*)()' to 'void* (*)(void*)' [-fpermissive]
pthread_create(&ctid,NULL,Consumer,NULL);
^
In file included from prog.cpp:2:0:
/usr/include/pthread.h:244:12: note: initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)'
extern int pthread_create (pthread_t *__restrict __newthread,
^
stdout