C++ 以特定顺序运行八个线程,直到终止

C++ 以特定顺序运行八个线程,直到终止,c++,multithreading,C++,Multithreading,我有一个核心2双核处理器 我想创建并运行八个线程,它们之间没有共享数据,这样在任何给定的时间内,所有八个线程都将运行一次,其中线程1和线程2将同时运行,如果处理器不能同时运行线程1和线程2,我想优先考虑线程1,以便线程1在线程2之前运行 类似地,线程3和4可以并发运行,但如果线程3和线程4不能同时运行,我希望线程3在线程4之前执行,而不是在线程1和2之前执行,也不是在线程5和6以及线程7和线程8之后执行 螺纹5和螺纹6、螺纹7和螺纹8的情况相同 所有8个线程完成任务后,8个线程将按照上述给定顺序

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

我想创建并运行八个线程,它们之间没有共享数据,这样在任何给定的时间内,所有八个线程都将运行一次,其中线程1和线程2将同时运行,如果处理器不能同时运行线程1和线程2,我想优先考虑线程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实现这一点?p>


是否有可能用C++ +

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

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

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

While(1)
{
   foo1();
   foo2();
   foo3();
   .
   .
   .
}

好的,在经过了很多争论之后,我想从你那里得到这个问题,下面是我要尝试回答的版本:

创建线程后,不能保证任何两个线程在双核处理器上同时运行。所以,如果两个线程不同时运行,我希望优先权被赋予,使线程1创建的第一个线程将首先运行,线程2创建的第二个线程将始终在线程1之后运行

幸运的是,答案相当简单。您的程序不知道何时运行哪些线程。操作系统不会告诉你它什么时候启动和停止线程,所以你不能编写任何类型的代码,线程1在运行吗?如果没有,我会暂停,让它运行检查

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


当然,像这样混淆优先级也会影响你的程序相对于PC上运行的所有其他程序的调度方式。你真的试图以错误的方式进行此操作,更明智的解决方案是简单地找到另一种并行化方案。

你确定要以这种方式使用线程吗?这正是它们不存在的原因。1和2可以同时运行,但线程2必须在线程1之后运行?这有什么意义?@Roman R.没有。我有八台ps3eye相机。我想使用线程机制从它们那里捕获图像,任何两个线程都可以同时运行。@jalf很抱歉造成混淆,但我的意思是如果线程1和线程2不能同时运行,那么线程2必须在线程1之后运行。我很确定,您想要的不是您想要的。你期望的行为是什么?你的实际问题是什么?一个猜测是,您希望您的系统以相同的速率从摄影机生成帧&因此您需要一个集合/屏障,以便您可以使用一整套帧执行任何操作?是的,我可以这样做。但我希望任意两个线程同时运行。@mvr950然后告诉我们允许哪两个线程同时运行time@jalf我所说的线程1,线程2…线程8是指线程1是从相机1捕获图像的线程,线程2是从相机2捕获图像的线程,线程3是从相机3捕获图像的线程。。。从照相机8上拆下螺纹8。我希望线程1和线程2同时运行,线程3和线程4同时运行。。。同时执行线程7和线程8。谢谢您的回答。是否有任何机制可以用来强制线程等待所有8个线程完成,然后重新启动?是的。每个C++编译器都给了我们一个机制。例如,在Posix线程中,我们有一个函数pthread_join。。。等待传递函数param的线程完成。因为你有8个线程,你可以在for循环中调用函数。如果不是真的,你当然可以阻止线程,直到另一个线程中的某些条件得到满足“找到另一个并行化方案”-是的,一个可行的方案。