用C语言开多线程,想让多个相同的子线程同时运行,怎么实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言开多线程,想让多个相同的子线程同时运行,怎么实现相关的知识,希望对你有一定的参考价值。
看了用HANDLE 线程名;
线程名=CreateThread(NULL,0,程序名,NULL,0,NULL);
的方式开,但是我想让这一个程序作为多个线程一起开的话怎么办呢,总不能开200个 ,就写200次吧。
用循环的话线程名又不一样,而且这个线程名也不是数字,不能用for,然后i++那样。
求问C或C++,而不是java。
AfxBeginThread有两种形式,一种是用来创建用户界面线程的,另一种就是用来创建工作线程的.为了开始执行线程,只需要向AfxBeginThread提供下面的参数就可以了.
1.线程函数的地址
2.传送到线程函数的参数
3.(可选的)线程的优先级,可参阅::SetThreadPriority
4.(可选的)线程开始时候的状态,可设置为CREATE_SUSPENEDE
5.(可选的)线程的安全属性,请参阅SECURITY_ATTRIBUTES
实例代码
UINT ThreadProc(LPVOID pParam)
return 0;//线程成功完成
CWinThread* AfxBeginThreadProc,//线程函数地址
LPVOID pParam,//线程参数
int nPriority=THREAD+PRIORITY_NOMAL,//线程优先级
int nStackSize=0,//线程堆栈大小,默认为1M
DWORD dwCreateFlags=0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL
); 参考技术A 线程名其实是一个地址,所以你要开200个线程,就可以做两百次循环,就可以了CreateThread()的返回HANDLE报存在一个数组里就可以了
HANDLE hThread[200];
for(int i = 0;i<200; i++)
hThread[i] = CreateThread(NULL,0,程序名,NULL,0,NULL);
这样就可以了本回答被提问者采纳 参考技术B 你可以用字符串,比如说abcd再连上i作为线程名啊
重述协程
重述协程
之前知道的,可以开多进程,每个进程又可以开多线程,线程又可以开协程,多进程可以占用多个cpu的核,一个进程同时只能占用一个核,因为每个进程默认有一个主线程,由于存在GIL全局解释器锁,所以导致了多线程也只能占用一个核。
什么是协程?
协程就是把多个任务都放在一个线程下面跑,计算密集型没用,甚至更差,io密集型有用,他可以用模块自动实现在遇到io的时候再任务间切换,而不被操作系统发现,尽可能长时间的占用cpu。
什么时候用多进程?
有多核,而且任务是计算密集型的时候。这样可以并行的去执行这些任务,如果是io密集型的话,浪费了开启多进程的资源,因为io的时候cpu是不执行的。
什么时候用多线程?
需要对同一个内存空间进行操作时,io密集型任务。
什么时候用协程?
当任务是io密集型的时候。
为什么不用多线程而用协程?
1、因为协程的切换是在应用程序之间切换,和多线程的cpu的切换相比起来快得多。
2、协程是在一个线程下的,意味着他已经拿到了线程锁,比如这时候有三个一样的任务都是循环200000次 x = x+1 ,因为协程中任务之间的切换是遇到io才会切换的,所以在循环的时候不会切换,就算这个时候占用cpu时间过长,而导致cpu切换到其他线程上,协程也会保留当前的状态,下次cpu再切到这里的时候继续运行。(总而言之,不需要锁了)
3、尽可能让cpu停留在自己的线程上,因为cpu切走之后,还有其他电脑程序的进程线程在跑,什么时候切回来都不知道,所以多线程会比协程耗费更多的时间。
以上是关于用C语言开多线程,想让多个相同的子线程同时运行,怎么实现的主要内容,如果未能解决你的问题,请参考以下文章