使用二进制信号量同步2个线程C ++

时间:2017-03-25 23:57:36

标签: c++ multithreading pthreads

我有一项任务,我完全不知道该怎么做。赋值是创建和使用2个线程并使用2个信号量(我认为最好使用二进制信号量)同步这些线程。该程序是一个跷跷板模拟器。人1(弗雷德)从地面开始,而人2(威尔玛)在空中开始。任何一个人可以去的最大高度是7(英尺,码,无论你想要什么)。当人2到达地面时,她以1.5单位/秒的速度推离地面,而弗雷德只能以1单位/秒的速度推开。每秒(使用睡眠)程序需要打印出每个人当前的高度。它需要运行10次(时间1(或第1轮)完成一旦人1达到最大高度,然后时间2(或第2轮)完成一旦人1返回地面。

到目前为止,我所拥有的代码实际上只是创建和加入两个线程(事实证明这有点挑战,因为我之前从未处理过线程。 BTW 这是用C ++编写的)。我理解信号量如何工作的概念,它们如何与保护关键部分一起工作,但我无法弄清楚实际使其工作的代码。我知道我已经拥有的代码并不多,但我仍然会把它放在下面供你参考。我研究过的所有东西都让我回到了使用互斥体(而不是信号量)。如果有人能帮助我,我将不胜感激。

谢谢

#include <iostream>
#include <pthread.h>
#include <mutex>
#include <condition_variable>

using namespace std;

mutex mtx;
condition_variable cv;
int fredHeight = 1;
int wilmaHeight = 7;

void *fredSee(void *param);
void *wilmaSaw(void *param);
void wait();
bool try_wait();
void signal();

int main()
{
  pthread_t thread1;
  pthread_t thread2;

  pthread_create(&thread1, NULL, fredSee, NULL);
  pthread_create(&thread2, NULL, wilmaSaw, NULL);

  pthread_join(thread1, NULL);
  pthread_join(thread2, NULL);

  return 0;
}

void *fredSee(void *param)
{

  pthread_exit(NULL);
}

void *wilmaSaw(void *param)
{

  pthread_exit(NULL);
}

修改: 我被限制使用信号量,我不知道如何正确使用它们。我添加了更多代码(见下文)。我已经添加了打印出两个人的高度并且功能完美的功能。在完成第二个主题之后,我不知道怎么去&#34;切换&#34;回到第一个,因为那基本上是需要发生的逻辑。

旁注:我认为我可以通过制作多个线程并调用相同的线程来强制它(即使我不认为我应该这样做)一遍又一遍地运作。

#include <iostream>
#include <pthread.h>
#include <mutex>
#include <condition_variable>

using namespace std;

mutex mtx;
condition_variable cv;

double fredHeight = 1;
double wilmaHeight = 7;
int value;

void *fredSee(void *param);
void *wilmaSaw(void *param);
void decrement();
unique_lock<mutex> lck(mtx);


int main()
{
  pthread_t thread1;
  pthread_t thread2;

  pthread_create(&thread1, NULL, fredSee, NULL);
  pthread_create(&thread2, NULL, wilmaSaw, NULL);

  pthread_join(thread1, NULL);
  pthread_join(thread2, NULL);

  return 0;
}

void *fredSee(void *param)
{
  while (fredHeight < 7)
  {
    fredHeight++;
    wilmaHeight--;
    cout << "Fred's Height: " << fredHeight << endl;
    cout << "Wilma's Height: " << wilmaHeight << endl;
  }
  cout << "Going down..." << endl;
  cout << endl;
  pthread_exit(NULL);
}

void *wilmaSaw(void *param)
{
  while (fredHeight > 1)
  {
    wilmaHeight = wilmaHeight + 1.5;
    fredHeight = fredHeight - 1.5;
    cout << "Fred's Height: " << fredHeight << endl;
    cout << "Wilma's Height: " << wilmaHeight << endl;
  }
  cout << "Going up..." << endl;
  cout << endl;
  pthread_exit(NULL);
}

/*This function I only added because I was watching a video on how to use semaphores
and they said that I need some sort of decrementer and incrementer.
Not sure if I even did it correctly but it compiled so I'm going to
think I did.  It's not actually used anywhere so it's not really doing anything*/
void decrement()
{
  while (value == 0)
  {
    try
    {
      cv.wait(lck, [] {return value == 0;});
    }
    catch (exception e)
    {
      cout << "ERROR" << endl;
    }
  }
}

0 个答案:

没有答案