即使使用了 -lpthread 和 -ltr,也未定义对 sem_init 和其他此类函数的引用

har*_*hav 3 c semaphore pthreads

这是我在 linux 中的 c 中读写器问题的代码。我看到了一些相同的先前问题,他们的解决方案是使用 -lpthread 或 -ltr,我单独和一起尝试了这两个问题,但仍然不断收到相同的错误。请帮忙。

#include<stdio.h>
#include<stdlib.h>  
#include<pthread.h>
#include<semaphore.h>

sem_t rmutex,wmutex,canwrite;
int readcount=0;

void *reader1(int i)
{
printf("Reader %d wants to read\n",i);
sem_wait(&rmutex);
readcount++; 
sem_post(&rmutex); 
printf("Reader %d is reading",i);

sem_wait(&rmutex);
readcount--;

if(readcount==0) 
sem_post(&canwrite);

sem_post(&rmutex);
printf("Reader %d is exiting",i);

}

void *writer1(int i)
{
printf("Writer wants to write\n");
sem_wait(&canwrite);
sem_wait(&wmutex);
printf("Writer is writing\n");
sem_post(&wmutex);
printf("Writer is exiting\n");
}



int main()
{
pthread_t *reader[3],*writer;
int i;
sem_init(&rmutex,0,1);
sem_init(&wmutex,0,1);
sem_init(&canwrite,0,1);


pthread_create(&writer,NULL,writer1,(void *)i);
for(i=0;i<3;i++)
pthread_create(&(reader[i]),NULL,reader1,(void *)i);

sleep(10000);

for(i=0;i<3;i++)
pthread_join(reader[i],NULL);

pthread_join(writer[i],NULL);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

#include<stdio.h>
#include<stdlib.h>  
#include<pthread.h>
#include<semaphore.h>

sem_t rmutex,wmutex,canwrite;
int readcount=0;

void *reader1(int i)
{
printf("Reader %d wants to read\n",i);
sem_wait(&rmutex);
readcount++; 
sem_post(&rmutex); 
printf("Reader %d is reading",i);

sem_wait(&rmutex);
readcount--;

if(readcount==0) 
sem_post(&canwrite);

sem_post(&rmutex);
printf("Reader %d is exiting",i);

}

void *writer1(int i)
{
printf("Writer wants to write\n");
sem_wait(&canwrite);
sem_wait(&wmutex);
printf("Writer is writing\n");
sem_post(&wmutex);
printf("Writer is exiting\n");
}



int main()
{
pthread_t *reader[3],*writer;
int i;
sem_init(&rmutex,0,1);
sem_init(&wmutex,0,1);
sem_init(&canwrite,0,1);


pthread_create(&writer,NULL,writer1,(void *)i);
for(i=0;i<3;i++)
pthread_create(&(reader[i]),NULL,reader1,(void *)i);

sleep(10000);

for(i=0;i<3;i++)
pthread_join(reader[i],NULL);

pthread_join(writer[i],NULL);

return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您还可以解释警告,那将非常有帮助。

Dre*_*wen 5

这有几个问题。

首先,不要pthread_t *用于您的变量类型,您应该只使用pthread_t(即,不是指针)。这就是警告所指的内容。

其次,您收到这些链接器错误的原因是您在命令行上指定输入文件和链接器选项的顺序很重要。由于rw.c取决于-lpthread,该-lpthread选项应该在之后 rw.c,而不是之前:

cc rw.c -lpthread
Run Code Online (Sandbox Code Playgroud)

  • 你应该把它作为一个单独的问题来问。 (2认同)