对于消费者/生产者,使用带信号量和线程的C进行文件复制

时间:2014-04-06 04:48:52

标签: c buffer fwrite producer-consumer

我需要按照标题所述的方式进行操作。限制是消费者和生产者只有12个插槽可以容纳20个字符。除了上一个制作人只输入13个字符(这是正确的)之外,我已经开始工作了,最后一个消费者不会认识到这一点。它写了20个字符,在我复制的文件的末尾添加了一些额外的字符。我已经考虑了一些问题,但找不到合适有效的解决方案让消费者认识到插槽中只有13个字符。我使用了跟随2行来生成和使用(两者都正确使用信号量并且同时在不同的线程上运行)。

由手头的问题给出:

#define SLOTSIZE 20
#define SLOTCNT 12
char buffer[SLOTCNT][SLOTSIZE];

制片:

count = fread(buffer[pIndex], sizeof(char), sizeof(buffer[pIndex]), myFile);

消费者:

count = fwrite(buffer[cIndex], sizeof(char), sizeof(buffer[cIndex]), myFile);

这是一项受欢迎的家庭作业,所以我不想发布很多代码。有任何想法吗?我相信在最后13个字符的末尾我需要一个EOF标记因为我认为它被抛出了。

P.S。再次为生产者,最后一次读取的结果使得count = 13;对于消费者来说,最后一次写入使得count = 20并且额外的字符在输出文件中。

1 个答案:

答案 0 :(得分:1)

只有大量的示例代码,如果没有一些猜测就很难给出正确的答案。

您的问题似乎是您不知道编写器中缓冲区中的有效字节数。 buffer似乎是一个char数组的数组?如果是,您可以将其改为结构数组,例如:

struct buf
{
    int used_length;
    char b[20];
};
struct buf buffer[20];

然后执行以下操作:

生产者:

buffer[pIndex].used_length = count = fread(buffer[pIndex].b, sizeof(char), sizeof(buffer[pIndex].b), myFile);

消费者:

count = fwrite(buffer[cIndex].b, sizeof(char), buffer[cIndex].used_length, myFile);

这样你只会写出你读的字节数。