所以我做了一个基于终端的测试,作为我的第一年项目,我决定在代码中显示一个计时器,但是定时器不允许程序继续进行,因为计时器中使用的是无限循环。
我如何处理这个问题?
void timer()
{
while (true) {
clock_display();//Function loaded with manipulators to just show the 00:00:00 interface
sleep(1);
sec++;
if (sec == 60) {
mins++;
if (mins == 60) {
hrs++;
mins = 0;
}
sec = 0;
}
}
}
int main(){
timer();
//Other code I have to run
}
发布于 2021-07-22 12:12:58
这个问题看上去更难。你想要同一个程序同时做两件事。虽然这是目前常见的情况,而且大多数程序都是这样运行的,但这并不是一年级学生所期望的水平。
你需要的是并发编程,应该是一件很难的事情。
这是我能想到的解决问题的最简单的例子。然而,并发性很难实现:您需要上一门特殊的课程来了解这里发生的事情和原因。
#include <iostream>
#include <thread>
#include <cmath>
void timer()
{
int sec = 0;
while (true)
{
#pragma omp critical
std::cout << sec++ << "\n";
std::this_thread::sleep_for(std::chrono::duration<double>(1.0));
}
}
void my_stuff()
{
for (int i = 0; i < 100; i++)
{
double x = 0.0;
for (int j = 0; j < 10'000'000; j++)
{
x += sin(i + j);
}
#pragma omp critical
std::cout << "x = " << x << "\n";
}
}
int main()
{
#pragma omp parallel
#pragma omp sections
{
#pragma omp section
timer();
#pragma omp section
my_stuff();
}
}
将其编译为使用C++的OpenMP程序:这是用于并发的最简单的库。在Linux:将-fopenmp
添加到编译器标志中,对于其他操作系统,互联网上充满了答案。
#include<thread>
只能运行sleep_for
来使程序进入睡眠状态。这是一种可移植的方法,但您可以使用其他方法。一般来说,them.critical
是并发的C++方式,但我认为这对你来说可能太难了。#pragma
。这不是一个OpenMP教程的地方,你自己找吧,有大量的C++实用主义引入了一个关键部分来保护竞争线程共享的资源(这里是:std::cout
)。如果程序已经正确编译并在至少有两个内核的处理器上运行(要运行的物理线程或virtual).section
标识),则自动生成(两个)线程。
就这样。我希望它能对你有用。
一旦开始工作,就可以找到一本关于OpenMP和/或C++11并发模型的好教程/教科书。
https://stackoverflow.com/questions/68483888
复制相似问题