Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Semafory: Czytelnicy i Pisarze (priorytet pisarza) - nieznany błąd

Ostatnio zmodyfikowano 2016-01-13 16:46
Autor Wiadomość
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):
C/C++
#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.
P-143449
DejaVu
» 2016-01-13 16:22:08
Kod się wkleja na forum.
P-143450
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.
P-143451
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.

P-143452
« 1 »
  Strona 1 z 1