认真学习的jerry 发表于 2023-11-17 09:28:47

线程中出现在main函数以外的函数未定义的引用怎么解决

在get函数里未定义的引用,怎么调试运行,大佬们顺便帮我把代码详细注释一下有点看不懂。万分感谢!
                        #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<pthread.h>
#define BUFFER_SIZE 16
        struct prodcons
        {
          int buffer;
          pthread_mutex_t lock;
          int readpos,writepos;
          pthread_cond_t notempty;
          pthread_cond_t notfull;
        };
        void init(struct prodcons *b)
        {
       pthread_mutex_init(&b->lock,NULL);
       pthread_cond_init(&b->notempty,NULL);
       pthread_cond_init(&b->notfull,NULL);
       b->readpos=0;
       b->writepos=0;
       
        }
        void put(struct prodcons *b,int data)
        {
       pthread_mutex_lock(&b->lock);
       while((b->writepos+1)%BUFFER_SIZE == b->readpos)
       {
               printf("wait for not full\n");
               pthread_cond_wait(&b->notfull,&b->lock);
       }
       b->buffer=data;
       b->writepos++;
       if(b->writepos>=BUFFER_SIZE)
       b->writepos=0;
       pthread_cond_signal(&b->notempty);
       pthread_mutex_unlock(&b->lock);
       
       
        }
        int get(struct prodcons *b)
        {
                int data;
                pthread_mutex_lock(&b->lock);
                while(b->writepos==b->readpos)
                {
                printf("wait for not empty\n");
                pthread_cond_wait(&b->notempty,&b->lock);
                }
                data=b->buffer;
                b->readpos++;
                if(b->readpos>=BUFFER_SIZE)
                b->readpos=0;
                pthread_cond_siggnal(&b->notfull);
                pthread_mutex_unlock(&b->lock);
                return data;
        }
#define OVER (-1)
        struct prodcons buffer;
        void *producer(void *data)
        {
                int n;
                for(n=0;n<=1000;n++)
                {
                        printf("put-->%d\n",n);
                        put(&buffer,n);
                }
                      put(&buffer,OVER);
                        printf("producer stopped!\n");
                        return NULL;
                       
        }
        void *consumer(void *data)
        {
                int d;
                while(1)
                {
                        d=get(&buffer);
                        if(d==OVER)break;
                        printf("%d-->get\n",d);
                }
                printf("consumer stopped!\n");
                return NULL;
        }       
        int main()
        {
       pthread_t th_a,th_b;
       void *retval;
       init(&buffer);
       pthread_create(&th_a,NULL,producer,0);
       pthread_create(&th_a,NULL,consumer,0);
       pthread_join(&th_a,retval);
       pthread_join(&th_a,retval);
       return 0;
        }
       
       
       
       
       
       

isdkz 发表于 2023-11-17 09:28:58

您的代码中出现了一些拼写错误,导致了未定义的引用问题。在 get 函数中, pthread_cond_siggnal 应该是 pthread_cond_signal ,这是一个拼写错误。

此外,您在 main 函数中创建线程时,使用了相同的线程变量 th_a 来创建生产者和消费者线程。这会导致消费者线程无法正确创建。您应该使用不同的线程变量来创建这两个线程。

另外,您在 pthread_join 函数的参数中使用了 & 操作符,这是不正确的。 pthread_join 函数的第一个参数应该是线程变量的地址,而不是地址的地址。

最后,您在 main 函数中调用 pthread_join 函数时,应该分别等待生产者线程和消费者线程的结束,而不是两次等待同一个线程。

以下是修改后的代码:

// ...(原始代码不变)

void *producer(void *data)
{
    // ...(原始代码不变)
}

void *consumer(void *data)
{
    // ...(原始代码不变)
}

int main()
{
    pthread_t th_producer, th_consumer; // 修改线程变量名
    void *retval;
    init(&buffer);
    pthread_create(&th_producer, NULL, producer, 0); // 使用不同的线程变量
    pthread_create(&th_consumer, NULL, consumer, 0); // 使用不同的线程变量
    pthread_join(th_producer, &retval); // 等待生产者线程结束
    pthread_join(th_consumer, &retval); // 等待消费者线程结束
    return 0;
}


希望这能帮助到您。如果您有任何其他问题,请随时问我。

Mike_python小 发表于 2023-11-17 09:29:36

这段代码是一个简单的生产者-消费者模型的实现。主要包括一个循环缓冲区(buffer)和两个线程函数(producer和consumer),通过线程间的同步来实现生产者往缓冲区中放入数据,消费者从缓冲区中取出数据的过程。

在你的代码中有几个问题需要解决:
1. 在put和get函数中有一个错别字,pthread_cond_siggnal应该是pthread_cond_signal。
2. 在main函数中创建线程时,使用了pthread_create(&th_a,NULL,producer,0);两次,应该将第二个创建线程的函数改为pthread_create(&th_b,NULL,consumer,0);,并且在调用pthread_join等待线程结束时也应该使用th_a和th_b作为参数。

另外,如果你碰到了"未定义的引用"错误,可能是因为在其他地方调用了get或put函数但是没有正确包含相应的头文件或者没有正确声明或定义这两个函数。你需要确保在调用get和put函数的地方,你包含了正确的头文件,并且在文件中声明或者定义了这两个函数。
希望这些能够帮助你解决问题!
页: [1]
查看完整版本: 线程中出现在main函数以外的函数未定义的引用怎么解决