考虑以下运行循环的示例程序;
int main()
{
for (int i = 0; i<= 300; ++i) {
}
}
非常基本,现在假设我想每秒打印出i
的值:
cout << "i= " << i << "\n";
如下所示的简单循环可能就足够了,其中“elaspedTime”是一个虚构的整数,包含操作系统神奇更新程序运行的秒数:
int lastTime = 0;
while (true) {
if (elapsedTime > lastTime) { // Another second has passed
cout << "i= " << "\n";
lastTime = elapsedTime;
}
}
这里的最终目标是提供如下输出(假设循环每秒运行100次,因为它位于旧的慢速CPU上):
$ ./myprog
i= 100
i= 200
i= 300
这些是简单的函数和例程,尽管如此,我认为无法在“经典”c ++程序中执行此类操作,该程序通常只有main()
函数。尽管这很简单,但我需要学习多线程吗?或者,是否可以从main()
调用函数而不是等待它们的返回,但没有那个被称为“占用”线程的函数?
答案 0 :(得分:3)
如果您希望两个函数在相同的时间彼此独立运行,则需要使用线程。您提供的示例不需要使用线程来完成您声明要完成的任务,但根据您的评论,我认为您的问题有点不清楚。
多线程是C ++ 03标准中未提及的内容。在最新的C ++ 11标准中有一些支持它,但它并不是最终的全部。实际实现多线程的方式是特定于平台的。 WinTel盒子单向操作,Linux / Intel盒子另外做。编写多线程代码的两种主要方法是:
刚刚开始时,我建议从一个跨平台库开始,这样你就可以获得许多大图概念,而不会被特定于平台的特性所困扰。其中一个库是Boost.Thread。
修改强>
鉴于你是多线程编程的新手,我觉得我应该警告你:你正在蒙着眼睛跳下深深的兔子洞。多线程编程有点像国际象棋 - 您可以相当快地学习大部分基本语法和系统调用,但执行多线程编程正确只会带来批次学习和实践。正确完成多线程编程是程序员将面临的最艰难的事情之一。
另外,请特别注意@ CrazyEddie的评论如下:
虽然故事发生变化,但从“功能”切换到“任务”。 根据任务的不同,一次完成许多任务是非常可能的。 由于像OP这样的事件循环通常花费大部分时间 睡觉,线程通常只是为了方便而不是 表现或必要性。我相信你知道这一点,但可能是OP 没有。 OP需要查找“异步处理”并权衡 使用线程与非阻塞操作和事件的好处/惩罚 环路。
答案 1 :(得分:1)
这样做有什么问题?无需多任务处理。
int lastTime = 0;
while (true) {
if (std::time() > lastTime) { // Another second has passed
cout << "i= " << i << "\n";
// potentially expensive code goes here, which updates "i"
lastTime = std::time();
}
}
答案 2 :(得分:0)
我很好奇你要解决的问题是什么。 “想知道一秒钟内完成了多少次迭代”的来自何处?我要问的原因是因为您将使用顶部讨论的单线程方法(检查时钟 - 增量 - 检查时钟 - 增量...检查时钟 - 打印)或多线程方法获得答案,两者都会引入线程运行的开销和不确定性。我的意思是:在这两种情况下,你都必须执行一堆额外的东西 - 单线程情况下的clock()调用和多线程情况下的线程同步。两者都会影响程序在一秒钟内完成的迭代总次数(数字会更小),因此您将得到不正确的结果。此外还有操作系统,当线程运行时以及等待下一个可用量程时,线程调度程序是决策者。并且量子大约是20-30毫秒,因此在时间间隔检查期间产生的错误很容易(可能平均而言)达到几个百分点。
保存开始时间不是更容易也更自然,然后执行处理所有数据所需的所有迭代(完成所有工作),然后再次获取时间戳并除以总迭代次数按时间间隔。或者你正在解决的问题有哪些特定的东西,这种方法不起作用?