如何多次顺序调用3个线程?
Posted
技术标签:
【中文标题】如何多次顺序调用3个线程?【英文标题】:How to call 3 threads sequentially many times? 【发布时间】:2012-10-24 04:39:48 【问题描述】:例如:在迭代 1 中,执行顺序应该是“Thread0->thread1->thread2”,然后在迭代 2 中应该是相同的,即“Thread0 -> thread1->thread2”等等。示例代码只执行一次 3 个线程。它不会进行第二次迭代。
Thread0 = CreateThread( NULL,0,ThreadProc0, NULL, CREATE_SUSPENDED, &ThreadID);
Thread1 = CreateThread( NULL,0,ThreadProc1, NULL, CREATE_SUSPENDED, &ThreadID);
Thread2 = CreateThread( NULL,0,ThreadProc2, NULL, CREATE_SUSPENDED, &ThreadID);
for(i=0;i<iterations;i++) //Iterations in calling threads
ResumeThread(Thread0);
WaitForSingleObject(Thread0, INFINITE);
ResumeThread(Thread1);
WaitForSingleObject(Thread1, INFINITE);
ResumeThread(Thread2);
WaitForSingleObject(Thread2, INFINITE);
// Close thread and semaphore handles
【问题讨论】:
为什么每个人尝试使用线程做的第一件事就是彻底击败线程的全部意义?! (您的问题似乎是基于一些误解。例如,您认为“调用 3 个线程”是什么意思?您调用函数。这并不意味着“调用”一个线程。) David.. 我知道我没有利用线程的强度,只是想知道这将如何工作?调用线程意味着只调用该线程函数.. “调用那个线程函数”是什么意思?什么是“线程函数”?你的意思是线程启动时运行的函数吗?如果是这样,则线程在启动时会自行调用该函数。 @DavidSchwartz 我是多线程新手.. 只是想实现这一点.. 请建议我如何实现这一点:) 老实说,我仍然不知道“这个”是什么。如果您不熟悉多线程,为什么不先学习如何以通常使用它们的方式使用它们呢?然后,一旦您了解了基础知识,您就可以学习一些疯狂的事情,例如调用线程、挂起线程或强制它们以特定顺序运行,而无需任何特殊原因。如果您希望线程执行某些任务,请创建一个函数来执行该任务,然后调用CreateThread
将该函数作为启动函数传递。首先掌握它。
【参考方案1】:
我认为你误解了这个概念。 ResumeThread
表示重新启动线程,不从头开始重新运行线程proc。它只是恢复之前停止的proc。
基本上有两种方式。
-
在每次迭代中创建新线程。
重写您的线程过程以“永远”存在并使用事件与其同步。
参考这里:How to restart threads?
【讨论】:
【参考方案2】:当您使用线程句柄调用WaitForSingleObject()
时,您正在等待线程完成运行(当它从其线程进程返回时)。完成后,ResumeThread()
将不再生效。
【讨论】:
但是在等待thread0完成运行后,我需要恢复thread1。为此,我使用了 ResumeThread()。但我的问题是for循环,为什么thread0/thread1/thread2没有执行多次? @Hello:WaitForSingleObject
仅在线程函数完成时才发出信号,您希望它如何再次运行?
我应该怎么做才能在下一次迭代中在 thread2 之后调用 thread0?
@Hello:我想知道您是否对线程的工作方式有一些基本的误解。也许你认为一个线程运行它的启动函数然后等待你告诉它再次运行它?如果是这样,不,线程运行它的启动函数,当该函数返回时,它终止。如果您想编写一个在重复之前等待条件的循环,您可以。但除非你编写代码,否则它不会发生。
@Hello:你说“call thread0”之类的话,但这没有任何意义。你不调用线程。如果你想启动/运行一个线程,调用CreateThread
。如果您想编写代码来创建一个线程,等待您告诉它做某事,然后它会循环或重复执行它们,那么您必须实际编写该代码。【参考方案3】:
您应该考虑使用事件来同步线程而不是 ResumeThread。
【讨论】:
以上是关于如何多次顺序调用3个线程?的主要内容,如果未能解决你的问题,请参考以下文章
多次调用自定义列表视图适配器 getView 方法,并且顺序不一致