【发布时间】:2011-09-22 09:12:56
【问题描述】:
我正在尝试使用线程来翻译下面的场景。
procA {
而(真){
更新(x);
检索(y);
}
}
过程B {
而(真){
检索(x);
更新(y);
}
}
为此编写了我在下面提供的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#define WORK_SIZE 10
pthread_mutex_t work_mutex;
int wa1[WORK_SIZE];
int wa2[WORK_SIZE];
void *funA(void *);
void *funB(void *);
int main(){
pthread_t tid1,tid2;
if(pthread_create(&tid1,NULL,funA,(void *)wa1))
perror("pthread_create");
if(pthread_create(&tid2,NULL,funB,(void *)wa2))
perror("pthread_create");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
return 0;
}
void *funA(void *ptr){
int *x=ptr;
int i=0,j,num;
//sleep(1);
while(i<=10){
num=rand();
*x=num;
x+1;
j=*wa2;
printf("A: %d\n",j);
wa2+1;
i++;
}
return NULL;
}
void * funB(void *ptr){
int *y=ptr;
int a=0,b,num;
while(a<=10){
num=rand();
b=*wa1;
printf("B: %d\n",b);
wa1+1;
*y=num;
y+1;
a++;
}
return NULL;
}
我需要实现 MUTEX,但这将在稍后出现。目前,根据我的理解,两个线程应该同时进行,因此 *wa1 和 *wa2 指向的地址应该同时更新。似乎我遗漏了一些东西,因此生成的输出是: 包括无限循环。更新了下图的o/p(仅部分输出)
答:1258442020 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 乙:1317969989 答:803738656 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 乙:1851766329 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464似乎在无限循环之后,发生了上下文切换,但我仍然不清楚输出。 random 函数应该生成一个新数字,但相同的数字会重复。请提供任何建议以及如何将其称为生产者-消费者问题我如何实施这个问题比我实施的问题更好
谢谢。
【问题讨论】:
-
使 while 循环无限并告诉我们输出的样子。
-
随机数只被其他进程改变,所以只在它活跃时改变。还要记住你的行“wa1+1”和“wa2+1”什么都不做;它们必须是“wa1++”才能生效。
-
哦,wa1 和 wa2 永远不会被写入。这也是为什么这些值不会改变的原因。编辑:哦,是的,他们是,对不起。这段代码太复杂了。
-
当我把它作为“wa1++”给它时,它没有被编译,所以我把它改成了这种方式。这些基本上是在增加指向的地址,我的印象是 &wa1/&wa2 每次循环迭代时都会更新。你能在这里指出我的错误吗?
-
你所做的就像写
3+1;。要增加指针中的地址,您必须编写wa1=wa1+1或wa1++
标签: c multithreading producer-consumer