C++线程概念

标签 c++ multithreading

考虑以下循环运行的示例程序;

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

这些都是简单的函数和例程,尽管如此,我认为没有办法在通常只有 main() 函数的“经典”c++ 程序中执行此类操作。尽管很简单,但我需要学习多线程吗?或者,是否可以从 main() 调用函数而不等待它们的返回,但调用的函数不会“占用”线程?

最佳答案

如果您希望两个函数在同一时间彼此独立地运行,您需要使用线程。您提供的示例不需要使用线程来完成您想完成的任务,但根据您的评论,我认为您的问题有点不清楚。

多线程是C++03标准中没有提到的东西。最新的 C++11 标准对它有一些支持,但它不是全部,而是全部。多线程的实际实现方式是特定于平台的。 WinTel 盒以一种方式执行,Linux/Intel 盒以另一种方式执行。编写多线程代码的两种主要方法是:

  1. 使用特定于平台的工具。
  2. 使用跨平台线程库。

刚开始时,这些天我建议从跨平台库开始,这样您就可以了解许多大局概念,而不会被特定于平台的特性所困扰。一个这样的库是 Boost.Thread .

编辑

鉴于您是多线程编程的新手,我觉得我应该警告您:您是在蒙着眼睛跳下一个很深的兔子洞。多线程编程有点像国际象棋——您可以相当快地学习许多基本语法和系统调用,但是正确的多线程编程只有很多才能做到> 学习和实践。正确完成多线程编程是程序员将面临的最困难的事情之一。

另外,请特别注意下面@CrazyEddie 的评论:

Once you switch from "function" to "task" though the story changes. It's very possible to do many tasks at once, depending on the task. Since event loops like the OP's usually spend most of their time sleeping, threads are usually only used for convenience rather than performance or necessity. I'm sure you know this, but the OP probably doesn't. OP needs to look up "asynchronous processing" and weigh the benefits/penalties of using threads vs non-blocking ops and event loops.

关于C++线程概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10518772/

相关文章:

c++ - 随机访问迭代器和双端队列

php - 在阻塞应用程序中使用响应式 PHP

java - 在 Java 中为方法创建超时的最佳方法是什么?

c++ - 递归模板函数无法分配给具有 const 限定类型 'state' 的变量 'const tt &'

c++ - 使用反向remove_if删除字符串

c++ - 在可变函数调用中执行一次语句

c++ - pthreads - 强制线程运行

c++ - C 中的 MPI 编程 - MPI_Send() 和 MPI_Recv() 地址问题

multithreading - 玩!框架 : Limit concurrent non-blocking IO calls made via WS

.net - 来自 Prometheus .NET 客户端库的 Metrics 实例是线程安全的吗