dovah993 Temat założony przez niniejszego użytkownika |
[C] Semafory: Czytelnicy i Pisarze (priorytet pisarza) - nieznany błąd » 2016-01-13 16:19:53 Witam. Dopiero nabywam umiejętności w pisaniu semaforów. W następującym programie posiadam taki błąd: mainprog.c: In function ‘reader’: mainprog.c:15:8: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘void *’ [-Wformat=] printf("\n\n reader-%d is reading",i); ^ mainprog.c: In function ‘writer’: mainprog.c:36:8: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘void *’ [-Wformat=] printf("\n\n writer-%d is writing",i); ^ /tmp/cczZiS1p.o: In function `reader': mainprog.c:(.text+0x32): undefined reference to `sem_wait' mainprog.c:(.text+0x42): undefined reference to `sem_wait' mainprog.c:(.text+0x52): undefined reference to `sem_wait' mainprog.c:(.text+0x79): undefined reference to `sem_wait' mainprog.c:(.text+0x89): undefined reference to `sem_post' mainprog.c:(.text+0x99): undefined reference to `sem_post' mainprog.c:(.text+0xa9): undefined reference to `sem_post' mainprog.c:(.text+0xcf): undefined reference to `sem_wait' mainprog.c:(.text+0xf5): undefined reference to `sem_post' mainprog.c:(.text+0x105): undefined reference to `sem_post' /tmp/cczZiS1p.o: In function `writer': mainprog.c:(.text+0x131): undefined reference to `sem_wait' mainprog.c:(.text+0x158): undefined reference to `sem_wait' mainprog.c:(.text+0x168): undefined reference to `sem_post' mainprog.c:(.text+0x178): undefined reference to `sem_wait' mainprog.c:(.text+0x195): undefined reference to `sem_post' mainprog.c:(.text+0x1a5): undefined reference to `sem_wait' mainprog.c:(.text+0x1cb): undefined reference to `sem_post' mainprog.c:(.text+0x1db): undefined reference to `sem_post' /tmp/cczZiS1p.o: In function `main': mainprog.c:(.text+0x203): undefined reference to `sem_init' mainprog.c:(.text+0x217): undefined reference to `sem_init' mainprog.c:(.text+0x22b): undefined reference to `sem_init' mainprog.c:(.text+0x23f): undefined reference to `sem_init' mainprog.c:(.text+0x253): undefined reference to `sem_init' mainprog.c:(.text+0x269): undefined reference to `pthread_create' mainprog.c:(.text+0x27f): undefined reference to `pthread_create' mainprog.c:(.text+0x295): undefined reference to `pthread_create' mainprog.c:(.text+0x2ab): undefined reference to `pthread_create' mainprog.c:(.text+0x2c1): undefined reference to `pthread_create' /tmp/cczZiS1p.o:mainprog.c:(.text+0x2d7): more undefined references to `pthread_create' follow /tmp/cczZiS1p.o: In function `main': mainprog.c:(.text+0x300): undefined reference to `pthread_join' mainprog.c:(.text+0x313): undefined reference to `pthread_join' mainprog.c:(.text+0x326): undefined reference to `pthread_join' mainprog.c:(.text+0x339): undefined reference to `pthread_join' mainprog.c:(.text+0x34c): undefined reference to `pthread_join' /tmp/cczZiS1p.o:mainprog.c:(.text+0x35f): more undefined references to `pthread_join' follow collect2: error: ld returned 1 exit status
Kod wygląda następująco (wybaczcie, ale nie wiem czemu nie mogę założyć tematu z tym kodem): #include<semaphore.h> #include<stdio.h> #include<pthread.h>
void * reader( void * ); void * writer( void * );
int readcount = 0, writecount = 0, sh_var = 5, bsize[ 5 ]; sem_t x, y, z, rsem, wsem; pthread_t r[ 3 ], w[ 2 ];
void * reader( void * i ) { printf( "\n-------------------------" ); printf( "\n\n reader-%d is reading", i ); sem_wait( & z ); sem_wait( & rsem ); sem_wait( & x ); readcount++; if( readcount == 1 ) sem_wait( & wsem ); sem_post( & x ); sem_post( & rsem ); sem_post( & z ); printf( "\nupdated value : %d", sh_var ); sem_wait( & x ); readcount--; if( readcount == 0 ) sem_post( & wsem ); sem_post( & x ); }
void * writer( void * i ) { printf( "\n\n writer-%d is writing", i ); sem_wait( & y ); writecount++; if( writecount == 1 ) sem_wait( & rsem ); sem_post( & y ); sem_wait( & wsem ); sh_var = sh_var + 5; sem_post( & wsem ); sem_wait( & y ); writecount--; if( writecount == 0 ) sem_post( & rsem ); sem_post( & y ); }
int main() { sem_init( & x, 0, 1 ); sem_init( & wsem, 0, 1 ); sem_init( & y, 0, 1 ); sem_init( & z, 0, 1 ); sem_init( & rsem, 0, 1 ); pthread_create( & r[ 0 ], NULL,( void * ) reader,( void * ) 0 ); pthread_create( & w[ 0 ], NULL,( void * ) writer,( void * ) 0 ); pthread_create( & r[ 1 ], NULL,( void * ) reader,( void * ) 1 ); pthread_create( & r[ 2 ], NULL,( void * ) reader,( void * ) 2 ); pthread_create( & r[ 3 ], NULL,( void * ) reader,( void * ) 3 ); pthread_create( & w[ 1 ], NULL,( void * ) writer,( void * ) 3 ); pthread_create( & r[ 4 ], NULL,( void * ) reader,( void * ) 4 ); pthread_join( r[ 0 ], NULL ); pthread_join( w[ 0 ], NULL ); pthread_join( r[ 1 ], NULL ); pthread_join( r[ 2 ], NULL ); pthread_join( r[ 3 ], NULL ); pthread_join( w[ 1 ], NULL ); pthread_join( r[ 4 ], NULL ); return( 0 ); }
Czym jest spowodowany ten błąd. Jestem początkujący w dziedzinie semaforów i nie jest to program mojego autorstwa. |
|
DejaVu |
» 2016-01-13 16:22:08 Kod się wkleja na forum. |
|
dovah993 Temat założony przez niniejszego użytkownika |
» 2016-01-13 16:30:43 Oczywiście, zgadzam się z tobą, ale dostaje taki komuniakt przy wklejeniu kodu:
Nie udało się wysłać formularza. Spróbuj ponownie. Kod błędu: 400 Opis: Bad Request
Udało mi się go jednak wkleić po czasie.
Prosiłbym o trzymanie się tematu i pomoc, na której mi bardzo zależy. |
|
DejaVu |
» 2016-01-13 16:46:37 To są błędy linkera - czytaj: musisz dołączyć odpowiednie biblioteki w opcjach linkera, aby były widoczne dla kompilatora implementacje funkcji, których używasz. /edit: http://stackoverflow.com/questions/1662909/undefined-reference-to-pthread-create-in-linux Both answers to this question so far are incorrect. For Linux the correct command is:
gcc -pthread -o term term.c
In general, libraries should follow sources and objects on command line, and -lpthread is not an "option", it's a library specification. On a system with only libpthread.a installed,
gcc -lpthread ...
will fail to link.
|
|
|
« 1 » |