【问题标题】:POSIX threads & semaphores [closed]POSIX线程和信号量[关闭]
【发布时间】:2013-03-07 15:55:04
【问题描述】:

我无法调试以下程序,因为我家里没有 linux。我无法执行该程序,但是当我在实验室会话中编译该程序时,我遇到了两个错误。谁能帮我吗?如果有人在调试后能够执行此程序,请发布输出。

代码如下:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
sem_t empty;
sem_t full;
pthread_mutex_t mutex;

int buffer[BUFFER_SIZE];

pthread_t ptid,ctid;
pthread_attr_t attr;

void *producer(void *param);
void *consumer(void *param);

int counter;
int main()
{

  init();
  pthread_create(&ptid, &attr, producer, NULL);
  pthread_create(&ctid, &attr, consumer, NULL);
  pthread_join(ptid,NULL);
  pthread_join(ctid,NULL);

  return 0;
}

void init()
{
  pthread_mutex_init(&mutex, NULL);
  pthread_attr_init(&attr);
  sem_init(&full, 0, 0);
  sem_init(&empty, 0, BUFFER_SIZE);
  counter = 0;
  for(int j=0;j<BUFFER_SIZE;j++)
  {  buffer[j] = 0;}
}

void *producer(void *param)
{
int item;
  while(1)
  {
    item=item+1;
    sem_wait(&empty);
    pthread_mutex_lock(&mutex);

    if(insert_item(item))
    {
      perror("Producer error.");
      return 1;
    }
    else
    {
      printf("Producer produced %d\n", item);
    }

    pthread_mutex_unlock(&mutex);
    sem_post(&full);
  }
}

void *consumer(void *param)
{
  int item;
  while(1)
  {
sleep(5);
    sem_wait(&full);
    pthread_mutex_lock(&mutex);
    if(remove_item(item))
    {
      perror( "Consumer error.");
    }
    else
    {
      printf("Consumer consumed %d\n", item);
    }

    pthread_mutex_unlock(&mutex);
    sem_post(&empty);
  }
}
int insert_item(int item)
{
  if(counter < BUFFER_SIZE)
  {
    buffer[counter] = item;
    counter++;
    return 0;
  }
  else
    return -1;

}

int remove_item(int item)
{
  if(counter > 0)
  {
    item = buffer[(counter-1)];
    counter--;
    return ;
  }
  else
    return -1;

}

在进行更改和更正后,我现在得到以下输出,这不是我们想要的......

[root@localhost sree58]# gcc producerconsumer.c -lpthread -lrt
producerconsumer.c: In function ‘producer’:
producerconsumer.c:54: warning: return makes pointer from integer without a cast
[root@localhost sree58]# ./a.out
Producer produced 1804289383
Producer produced 846930886
Producer produced 1681692777
Producer produced 1714636915
Producer produced 1957747793
Producer produced 424238335
Producer produced 719885386
Producer produced 1649760492
Producer produced 596516649
Producer produced 1189641421
Consumer error.: Success
Producer produced 1025202362
Consumer error.: Illegal seek
Producer produced 1350490027
Consumer error.: Illegal seek
Producer produced 783368690
Consumer error.: Illegal seek
Producer produced 1102520059
Consumer error.: Illegal seek
Producer produced 2044897763
Consumer error.: Illegal seek
Producer produced 1967513926
Consumer error.: Illegal seek
Producer produced 1365180540
Consumer error.: Illegal seek
Producer produced 1540383426
Consumer error.: Illegal seek
Producer produced 304089172
Consumer error.: Illegal seek
Producer produced 1303455736
Consumer error.: Illegal seek
Producer produced 35005211
Consumer error.: Illegal seek
Producer produced 521595368
Consumer error.: Illegal seek
Producer produced 294702567
Consumer error.: Illegal seek
Producer produced 1726956429

请有人指导我......

【问题讨论】:

  • 什么错误?本人不提供免费调试服务。
  • 我知道.....但是请帮助我......我正在寻求帮助,因为我家里没有 linux......而且我明天必须提交这个程序...... ..错误与我猜的init()函数有关.....请帮帮我....
  • 尝试使用任何免费提供的在线 IDE:s。我认为它们很可能会在类似 Linux 的环境中构建。
  • 你听说过Oracle's VirtualBox吗?这是一个非常简单的应用程序,可让您在 Windows 机器中运行 Linux 机器,而且它是免费的!

标签: c pthreads semaphore producer-consumer


【解决方案1】:

首先,让我们解决这个问题(帮助自己的工具):since i don't have linux at home

访问 Oracle 的站点并下载 VirtualBox,然后转到您最喜欢的 Linux 发行版的站点并下载它的 .iso 映像(例如,如果您喜欢 Minty,您可以去获取一个 iso here

然后您可以按照说明在虚拟机中设置和“安装”iso,瞧!你家里有 Linux。 ;)

其次,我会解决这个问题:i got two errors

真的吗?你是如何编译这个的?使用gcc -Wall 运行代码时,我看到大量警告和 1 个错误。一个错误也告诉您如何在消息中修复它:

38:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
38:3: note: use option -std=c99 or -std=gnu99 to compile your code

添加该命令 gcc -Wall -std=c99 现在您会看到由于缺少 pthread 库而导致的未定义引用:

undefined reference to `pthread_create'

通过以下链接修复:

gcc -Wall -std=c99 <yourfile>.c -lpthread

现在你只有一堆(重要的)警告:

In function ‘main’:
22:3: warning: implicit declaration of function ‘init’ [-Wimplicit-function-declaration]
At top level:
31:6: warning: conflicting types for ‘init’ [enabled by default]
22:3: note: previous implicit declaration of ‘init’ was here

In function ‘producer’:
51:5: warning: implicit declaration of function ‘insert_item’ [-Wimplicit-function-declaration]
54:7: warning: return makes pointer from integer without a cast [enabled by default]

In function ‘consumer’:
71:1: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]
74:5: warning: implicit declaration of function ‘remove_item’ [-Wimplicit-function-declaration]

In function ‘remove_item’:
106:5: warning: ‘return’ with no value, in function returning non-void [enabled by default]

In function ‘consumer’:
74:19: warning: ‘item’ is used uninitialized in this function [-Wuninitialized]

【讨论】:

  • 感谢您指导我......
  • @chinu - 不客气,如果您在设置 VirtualBox 时遇到任何问题,可以在 Superuser 网站上提问。
  • 我现在检查了虚拟机......但网站信息说我需要在我的电脑上进行 64 位配置.....但我有 32 位配置。 .......
  • @chinu - 不确定你在哪里读到的,但我知道它适用于两者(安装目录中有 32 位和 64 位 exe)。查看documentation for requirements on windows here
  • @chinu , 在 remove_item 中,做return语句的更正
【解决方案2】:

我在实验室会话中编译程序,我有两个错误.....可以 有人帮帮我吗???

1) 删除for(int j=0;j&lt;BUFFER_SIZE;j++);中的for循环初始声明,或使用选项-std=c99进行编译

2) 与 pthread 库链接。

gcc  main.c -lpthread

还有一堆警告,注意修复。

-- 编辑--

在您的 remove_item() 中,更改返回;返回 0;

这是输出

Producer produced 4001537
Producer produced 4001538
Producer produced 4001539
Producer produced 4001540
Producer produced 4001541
Producer produced 4001542
Producer produced 4001543
Producer produced 4001544
Producer produced 4001545
Producer produced 4001546
Consumer consumed 4001536
Producer produced 4001547
Consumer consumed 4001536
Producer produced 4001548
Consumer consumed 4001536
Producer produced 4001549
Consumer consumed 4001536
Producer produced 4001550
Consumer consumed 4001536
Producer produced 4001551
Consumer consumed 4001536
Producer produced 4001552
Consumer consumed 4001536
Producer produced 4001553
Consumer consumed 4001536
Producer produced 4001554
Consumer consumed 4001536
Producer produced 4001555
Consumer consumed 4001536
;;;;;;;;
;;;;;;;;
;;;;;;;;
;;;;;;;;

【讨论】:

  • 这个输出是在修复removeitem函数中return语句的错误之前....对吗????
  • 修复return语句后没有
  • ohhhk 谢谢.....这意味着我的程序仍然有问题......消费者没有消费该项目......对吗????
  • @chinu,抱歉之前的输出是在修复return之前,现在我已经发布了修复后的输出,你的程序运行正常
猜你喜欢
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-26
相关资源
最近更新 更多