Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*=========================================================*/
- /* race.c --- for playing with ECE437 */
- /*=========================================================*/
- #include <unistd.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <pthread.h>
- struct {int balance[2];} Bank={{100,100}}; //global variable defined
- //Sem437* lock = (Sem437*)malloc(sizeof(Sem437));
- typedef struct {int S;} Sem437;
- void Sem437Init(Sem437* sem, int a)
- {
- printf("in init function\n");
- sem->S = 1;
- printf("leaving init function\n");
- }
- void Sem437P(Sem437* sem)
- {
- while(&sem->S == 0)
- ;
- sem->S--;
- }
- void Sem437V(Sem437* sem)
- {
- sem->S++;
- }
- // Sem437* lock;
- // Sem437Init(lock, 1);
- Sem437* lock = (Sem437*)malloc(sizeof(Sem437));
- //int a = 1;
- //lock->S = 1;
- void* MakeTransactions() { //routine for thread execution
- int i, j, tmp1, tmp2, rint; double dummy;
- Sem437P(lock);
- for (i=0; i < 100; i++) { rint = (rand()%30)-15;
- if (((tmp1=Bank.balance[0])+rint)>=0 && ((tmp2=Bank.balance[1])-rint)>=0) {
- // Sem437P(lock);
- Bank.balance[0] = tmp1 + rint;
- // Sem437V(lock);
- for (j=0; j < rint*100; j++) {dummy=2.345*8.765/1.234;}
- // Sem437P(lock);
- Bank.balance[1] = tmp2 - rint;
- // Sem437V(lock);
- }
- }
- Sem437V(lock);
- return NULL;
- }
- int main(int argc, char **argv) {
- int i; void* voidptr=NULL; pthread_t tid[2];
- //Sem437* lock;
- //Sem437* lock = (Sem437*)malloc(sizeof(Sem437));
- int a = 1;
- lock->S = 1;
- printf("got to here\n");
- //Sem437Init(lock, a);
- printf("Lock has value %d \n", lock->S);
- srand(getpid());
- printf("Init balances A:%d + B:%d ==> %d!\n",
- Bank.balance[0],Bank.balance[1],Bank.balance[0]+Bank.balance[1]);
- for (i=0; i<2; i++) if (pthread_create(&tid[i],NULL,MakeTransactions, NULL)) {
- fprintf(stderr, "Error in thread creating\n"); return(1); }
- for (i=0; i<2; i++) if (pthread_join(tid[i], (void*)&voidptr)) {
- fprintf(stderr, "Error in thread joining\n"); return(1);}
- printf("Let's check the balances A:%d + B:%d ==> %d ?= 200\n",
- Bank.balance[0],Bank.balance[1],Bank.balance[0]+Bank.balance[1]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement