多个线程如果共用同个线程函数,是否拥有各自的数据区域

时间:2021-03-02 18:35:30
多个线程如果线程函数是同一个函数,比如 fun(),那么他们在运行的时候是自己拥有一份该函数的拷贝(即各自的数据区域),还是共用一份(如果是共用一份,那肯定会出错吧)。

现在我有个需求,求大家给点建议:

要从服务器上下4张图片,下完后把他们合成为1张, 我以前用的是单线程中用CInternetSession下载4次后再合成,结果老大们说效率不行(我觉得是服务器不行),要改成并发下载.

我使用4个线程下载4个图片后,再用一个线程去合成可以吗?这样就是 4 + 1 个线程,如何同步呢?特别是合成的线程,要等待多个事件? 
或者4个线程下载后,再发消息给UI线程去合成(当然,要判断一下4个都下好了再合成),哪个比较好了

10 个解决方案

#1


线程共享进程的数据

#2


共用一份代码,局部变量分开

#3


每个线程有自己的栈空间
堆空间是共享的,但不会冲突

#4


如果你的4个工作现场不设计到操作公共缓冲区(读写,至少有个线程需要写缓冲区数据),则不需要考虑同步

#5


用WaitForMultipleObjects等待四个线程全部结束

#6


WaitForMultipleObjects

#7


UI线程中WaitForMultipleObjects等待四个子线程完成后再合成 

#8


没错,比如下载软件128个线程,都是独立的。

#9


兄弟你刚回答了我一个问题,我也来回答你问题
其实函数永远只有一份,唯一变的是局部变量,比如递归
你这个问题不需要同步,直接一次性分配所有空间,然后给每个线程分配一个空间,下载下来以后就写入各自分配缓冲区就是了,当最后一个线程执行结束,整个数据就接收OK了。
如果还有问题,给我发消息

#10


局部变量不共享,全局、静态变量共享,注意全局、静态变量使用时线程同步就行了

#1


线程共享进程的数据

#2


共用一份代码,局部变量分开

#3


每个线程有自己的栈空间
堆空间是共享的,但不会冲突

#4


如果你的4个工作现场不设计到操作公共缓冲区(读写,至少有个线程需要写缓冲区数据),则不需要考虑同步

#5


用WaitForMultipleObjects等待四个线程全部结束

#6


WaitForMultipleObjects

#7


UI线程中WaitForMultipleObjects等待四个子线程完成后再合成 

#8


没错,比如下载软件128个线程,都是独立的。

#9


兄弟你刚回答了我一个问题,我也来回答你问题
其实函数永远只有一份,唯一变的是局部变量,比如递归
你这个问题不需要同步,直接一次性分配所有空间,然后给每个线程分配一个空间,下载下来以后就写入各自分配缓冲区就是了,当最后一个线程执行结束,整个数据就接收OK了。
如果还有问题,给我发消息

#10


局部变量不共享,全局、静态变量共享,注意全局、静态变量使用时线程同步就行了