Как заставить одну pthread продолжить, пока другой поток ожидает семафор в C ++? - PullRequest
1 голос
/ 18 апреля 2019

В настоящее время я перебираю пример, который наш профессор дал нам перед нашим текущим заданием с семафорами и pthreading в C ++. В настоящее время вся программа ожидает, когда один из потоков заблокирован.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <unistd.h>
#include <iostream>

using namespace std;

int account = 99;
bool sent = false;
int rate = 12;
int hours = 15;
sem_t s1;
sem_t s2;


//work thread
void *work(void*){
  while(1){
      sem_wait(&s1);
      account += hours * rate;
      cout << "Account: " << account << endl;
      if(account >= 1000 && !sent){
          sem_post(&s2);
          sent = true;
      }
      sem_post(&s1);

      pthread_exit(NULL);
  }
}

void* buy(void*){
  while(1){
      sem_wait(&s2);
      sem_wait(&s1);
      account -= 1000;
      sent = false;
      cout << "iPhone bought!! Account: " << account << endl;
      sem_post(&s1);
      pthread_exit(NULL);
  }
}

int main(){

  pthread_t workt, buyt;
    sem_init(&s1, 0, 1);
    sem_init(&s2, 0, 0);

  while(1){
    pthread_create( &workt, NULL, work, NULL);
    pthread_create( &buyt, NULL, buy, NULL);

    pthread_join(workt, NULL);
    pthread_join(buyt, NULL);
  }
    sem_close(&s1);
    sem_close(&s2);

    pthread_exit(NULL);
}

Программа должна непрерывно запускать рабочий поток до тех пор, пока на счету не появится достаточное количество (1000), затем она купит iPhone. Мой код будет работать до тех пор, пока он не достигнет семафора sem_wait (s2) в потоке 'buy', который блокирует поток должным образом, но вся моя программа ожидает и не запускает поток 'work' снова.

1 Ответ

0 голосов
/ 18 апреля 2019

Вы вызываете pthread_exit(NULL); на каждой итерации вашего цикла в work. В основном это действует так, как будто нет петли.

Может быть, вы имеете в виду что-то вроде:

  while(!sent){
      sem_wait(&s1);
      account += hours * rate;
      cout << "Account: " << account << endl;
      if(account >= 1000){
          sem_post(&s2);
          sent = true;
      }
      sem_post(&s1);

  }
  pthread_exit(NULL);
...