我正在使用 gcc 编译这个 c 程序,该程序仅依赖于 2 个创建的线程,一个用于递增计数器,第二个读取计数器并从计数器中减去一个随机 (0-9( 值,然后显示计数器的值,使用信号量访问它。仍然在编译时,我面临很多对 sem_init/sem_wait/sem_post/pthread_create/.. 的未定义引用。等等'我不知道为什么,尽管我在我的程序中将它们关联为标头。
我正在使用'gcc -o prog prog.c'来编译我的程序。
#include<semaphore.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int counter=0;
int run=1;
sem_t mutex;
void * increm();
void * decrem();
void main()
{ sem_t mutex;
sem_init(&mutex,0,1);
pthread_t t1,t2;
pthread_create(&t1,NULL,increm,NULL);
pthread_create(&t2,NULL,decrem,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
sem_destroy(&mutex);
}
void * increm()
{ while(run)
{sem_wait(&mutex);
counter++;
sem_post(&mutex);
}
pthread_exit(NULL);
}
void * decrem()
{ int i=25;
while(i>0)
{sem_wait(&mutex);
counter-=(rand()%10);
printf("Counter value : %d n",counter);
i--;
sem_post(&mutex);
}
run=0;
pthread_exit(NULL);
}
使用[...]在编译时,我面临很多'未定义的引用 sem_init/sem_wait/sem_post/pthread_create/..等等'我不知道为什么 尽管我在程序中将它们关联为标头。
我正在使用'gcc -o prog prog.c'来编译我的程序。
GCC,您应该在编译和链接使用 pthreads 函数的程序时传递 -pthread
选项以gcc
:
gcc -pthread -o prog prog.c
至少,这将导致所需的库包含在链接中,但原则上,它可能会对某些版本的 GCC 和某些平台上的代码生成产生影响。
另请参阅编译时 -pthread 标志的意义、编译时 -pthread 和 -lpthread 之间的区别等等。