在C ++中,如何让一个pthread继续而另一个线程正在等待信号量?

时间:2019-04-18 01:26:20

标签: c++ multithreading pthreads semaphore

我目前正在研究一个例子,在我们当前的工作之前,我们的教授在C ++中使用了信号量和pthreading。当前,当其中一个线程被阻塞时,整个程序将等待。

#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)信号量为止,这会阻塞该线程,但我的整个程序会等待并且不会再次运行“工作”线程。

1 个答案:

答案 0 :(得分:0)

您在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);