我正在尝试使用线程翻译下面的场景。
procA { while (TRUE) { update(x); retrieve(y); } } procB { while (TRUE) { retrieve(x); update(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(仅输出的一部分)
A: 1258442020 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 A: 803738656 B: 1317969989 A: 803738656 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 A: 1251276256 B: 1851766329 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464 B: 455345464
似乎在无限循环之后,发生了上下文切换,但我仍然不清楚输出。随机函数应生成一个新数字,但相同的数字会重复。请提出任何建议以及如何将其称为生产者 - 消费者问题如何实施此问题的方式比我实施的方式更好
感谢。
答案 0 :(得分:0)
十次迭代很少,以至于在上下文切换发生之前处理它们,因此您不会看到任何并发性。对不起,我无法从代码中说出任何内容,因为它缺少缩进,注释和良好的变量名称。