我正在尝试使用线程来翻译以下方案。
procA { while (TRUE) { update(x); retrieve(y); } } procB { while (TRUE) { retrieve(x); update(y); } }
Have written the code for this which I have provided below:
#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
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
乙:1317969989
A: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
似乎在无限循环之后,发生了上下文切换,但是我仍然不清楚输出。随机函数应该生成一个新数字,但是相同的数字正在重复。请提出任何建议,以及如何将其称为生产者-消费者问题我如何实施此问题是比我已经实施的更好的方式
谢谢。
最佳答案
十次迭代是如此之少,以至于它们在上下文切换发生之前就已经得到了处理,因此您不会看到任何并发性。很抱歉,我无法从您的代码中真正得知任何信息,因为它缺少缩进,注释和良好的变量名。