鱼C论坛

 找回密码
 立即注册
查看: 408|回复: 2

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

[复制链接]
发表于 2023-11-17 09:28:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在get函数里未定义的引用,怎么调试运行,大佬们顺便帮我把代码详细注释一下有点看不懂。万分感谢!
                        #include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<pthread.h>
#define BUFFER_SIZE 16
        struct prodcons
        {
          int buffer[BUFFER_SIZE];
          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[b->writepos]=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];
                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;
        }
       
       
       
       
       
       
最佳答案
2023-11-17 09:28:58
您的代码中出现了一些拼写错误,导致了未定义的引用问题。在 get 函数中, pthread_cond_siggnal 应该是 pthread_cond_signal ,这是一个拼写错误。

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

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

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

以下是修改后的代码:

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

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

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

  10. int main()
  11. {
  12.     pthread_t th_producer, th_consumer; // 修改线程变量名
  13.     void *retval;
  14.     init(&buffer);
  15.     pthread_create(&th_producer, NULL, producer, 0); // 使用不同的线程变量
  16.     pthread_create(&th_consumer, NULL, consumer, 0); // 使用不同的线程变量
  17.     pthread_join(th_producer, &retval); // 等待生产者线程结束
  18.     pthread_join(th_consumer, &retval); // 等待消费者线程结束
  19.     return 0;
  20. }
复制代码


希望这能帮助到您。如果您有任何其他问题,请随时问我。
55d28addb9b723e846ff9b082929f57.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-17 09:28:58 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +30 鱼币

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

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

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

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

以下是修改后的代码:

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

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

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

  10. int main()
  11. {
  12.     pthread_t th_producer, th_consumer; // 修改线程变量名
  13.     void *retval;
  14.     init(&buffer);
  15.     pthread_create(&th_producer, NULL, producer, 0); // 使用不同的线程变量
  16.     pthread_create(&th_consumer, NULL, consumer, 0); // 使用不同的线程变量
  17.     pthread_join(th_producer, &retval); // 等待生产者线程结束
  18.     pthread_join(th_consumer, &retval); // 等待消费者线程结束
  19.     return 0;
  20. }
复制代码


希望这能帮助到您。如果您有任何其他问题,请随时问我。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-17 09:29:36 | 显示全部楼层
这段代码是一个简单的生产者-消费者模型的实现。主要包括一个循环缓冲区(buffer)和两个线程函数(producer和consumer),通过线程间的同步来实现生产者往缓冲区中放入数据,消费者从缓冲区中取出数据的过程。

在你的代码中有几个问题需要解决:
1. 在putget函数中有一个错别字,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_ath_b作为参数。

另外,如果你碰到了"未定义的引用"错误,可能是因为在其他地方调用了getput函数但是没有正确包含相应的头文件或者没有正确声明或定义这两个函数。你需要确保在调用getput函数的地方,你包含了正确的头文件,并且在文件中声明或者定义了这两个函数。
希望这些能够帮助你解决问题!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-20 13:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表