所有' sem'未定义的引用和' pthread'编译时的功能

时间:2018-01-06 18:20:06

标签: c thread-synchronization

我使用gcc编译这个c程序,它只依赖于2个创建的线程,一个用于递增计数器,第二个读取计数器并从计数器中减去一个随机(0-9)值,并且然后显示计数器的值,使用信号量访问它。在编辑的过程中,我还面临很多问题。未定义的引用sem_init / sem_wait / sem_post / pthread_create / .. etc'虽然我在程序中将它们与标题相关联,但我不知道为什么。

我正在使用' 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);
 }

1 个答案:

答案 0 :(得分:1)

  

[...]编辑后,我面对很多&#39;未定义的引用   sem_init / sem_wait / sem_post /在pthread_create / ..等等&#39;我不知道为什么   虽然我在程序中将它们与标题相关联。

     

我正在使用&#39; gcc -o prog prog.c&#39;来编译我的程序。

使用GCC时,您应该在编译时以及链接使用pthreads函数的程序时将-pthread选项传递给gcc

gcc -pthread -o prog prog.c

至少,这将导致所需的库(-ies)包含在链接中,但原则上,它可能会对某些版本的GCC和某些平台上的代码生成产生影响。

另请参阅Significance of -pthread flag when compilingDifference between -pthread and -lpthread while compiling和其他许多内容。