我有一项任务,我完全不知道该怎么做。赋值是创建和使用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;
}
}
}