-2

我有一个核心 2 双核处理器。

我想创建并运行八个线程(它们之间没有共享数据),以便在任何给定时间所有八个线程都将运行一次,其中线程 1 和线程 2 将同时运行,如果线程 1 和线程 2 可以' t 由处理器同时运行我希望线程 1 具有优先级,以便线程 1 将在线程 2 之前运行。

同样,线程 3 和 4 可以同时运行,但如果线程 3 和线程 4 不能同时运行,我希望线程 3 在线程 4 之前执行,而不是在线程 1 和 2 之前执行,而不是在线程 5 和 6 以及线程 7 之后执行线程 8。

线程 5 和线程 6、线程 7 和线程 8 相同。

在所有 8 个线程完成其任务后,8 个线程将按上述给定顺序一次又一次地运行,直到终止。

如何在 Windows 7 上使用 c++ 和 Visual Studio 2008 实现这一点?

是否可以用 c++ 来实现?

4

3 回答 3

0

我不认为你可以控制线程的执行顺序。创建线程后,由操作系统为您进行调度。您所能做的就是等待线程在您的父线程中完成。

于 2012-10-20T12:35:38.043 回答
0

什么?您想使用运行线程 1,然后使用线程 2 ...

不要使用线程。使用 while 循环并调用:

While(1)
{
   foo1();
   foo2();
   foo3();
   .
   .
   .
}
于 2012-10-20T12:35:54.813 回答
0

好的,经过大量争论才能真正解决您的问题,这是我要尝试回答的版本:

创建线程后,不能保证任何两个线程都会在双核处理器上同时运行。因此,如果两个线程不同时运行,我希望优先考虑线程 1(首先创建)将首先运行,线程 2(第二个创建)将始终在线程 1 之后运行。

幸运的是,答案相当简单。您的程序不知道何时运行哪些线程。操作系统不会告诉您何时启动和停止线程,因此您不能编写任何类型的“线程 1 是否正在运行?如果没有,我将暂停并让它运行”检查。

但是您可以将线程设置为具有不同的优先级。这向操作系统指示它应该安排哪些执行。给你的线程一个逐渐降低的优先级(所以线程 1 具有高优先级,线程 2 低一级,依此类推),你会做出一些近似于你想要的东西。在 Windows 上,这实际上可能效果很好,因为 Windows 总是尝试选择优先级最高的可用线程/进程。Linux 将尝试确保所有线程都有一些执行时间,但只会给更高优先级的线程更多。

当然,像这样搞乱优先级也会影响您的程序相对于 PC 上运行的其他所有内容的调度方式。你真的试图以错误的方式解决这个问题,更明智的解决方案是简单地找到另一个并行化的方案。

于 2012-10-20T13:22:11.847 回答