动态库被多线程调用的问题?坐等结贴。

96掌门师兄 2012-11-22 05:25:57
如果一个动态库静态加载,那么是不是进程中的所有线程都共用该动态库的同一份内存空间呢? 那样就算不使用全局和静态变量,动态库被多线程调用,也很危险啊。比如一个函数

int sum(int x, int y)
{



......做一些其他的事情

return x +y ;
}

这样第一个进程调用的时候 sum(10, 20),当它还没有执行到 x+y的时候,另一个线程调用sum(100, 50);
这样x和y的值都被改变了,返回的是100+50了?
我觉得就算是动态库,当做个线程调用这个函数的时候,函数的数据在自己的线程区域应该是独立的,就是说线程1和线程2应该独自有一份x,y的数据拷贝,互相独立不干扰的。可以这样理解吗?

多谢大家了。
...全文
776 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
z2357 2012-11-22
  • 打赏
  • 举报
回复
即使静态加载也是各管各的。线程上下文,程序堆栈,是各不相同。
傻X 2012-11-22
  • 打赏
  • 举报
回复
总结下: 带Lib的导出,不存在你所说的情况。 LoadLibrary是函数指针模式,不支持你所说的情况。
傻X 2012-11-22
  • 打赏
  • 举报
回复
我一直觉得这是隐式导出和显示导出的动态连接库有关系的 先说带Lib的隐式导出,通常我喜欢把类封装在里面。调用起来直接new的一下,只要自己控制进程在公共资源上面互斥就完全没问题。一个DLL,随便几个实例,多线程都没关系。 相反显示导出的(LoadLibrary方式),多线程的情况下一旦你的dll被load后,就被绑死了。需要复制多份相同的DLL来达到目的。我觉得这个楼主应该有映像的。
向立天 2012-11-22
  • 打赏
  • 举报
回复
用汇编来理解这些问题比较一目了然 我觉得这里解释的不错 你可以参考一下 http://baike.baidu.com/view/2369016.htm#4
96掌门师兄 2012-11-22
  • 打赏
  • 举报
回复
引用 3 楼 stjay 的回复:
引用 2 楼 xiaoxiaoyu85 的回复: 引用 1 楼 hotpos 的回复:跟普通的多线程调用同一个函数是一样的处理. dll是给exe打了一块补丁, 打完了这个补丁, 补丁里面跟exe可以看做是一样的. 那就是有一个自己独立的数据区域了? 这个“数据区域”是栈
多谢了,这块的知识,能仔细讲解下吗?
96掌门师兄 2012-11-22
  • 打赏
  • 举报
回复
还有回复的吗?
dllg1988 2012-11-22
  • 打赏
  • 举报
回复
静态链接的话,链接此DLL的进程应该独占一份,不会影响到其他进程的使用。 个人理解说错了请纠正
stjay 2012-11-22
  • 打赏
  • 举报
回复
引用 2 楼 xiaoxiaoyu85 的回复:
引用 1 楼 hotpos 的回复:跟普通的多线程调用同一个函数是一样的处理. dll是给exe打了一块补丁, 打完了这个补丁, 补丁里面跟exe可以看做是一样的. 那就是有一个自己独立的数据区域了?
这个“数据区域”是栈
96掌门师兄 2012-11-22
  • 打赏
  • 举报
回复
引用 1 楼 hotpos 的回复:
跟普通的多线程调用同一个函数是一样的处理. dll是给exe打了一块补丁, 打完了这个补丁, 补丁里面跟exe可以看做是一样的.
那就是有一个自己独立的数据区域了?
hotpos 2012-11-22
  • 打赏
  • 举报
回复
跟普通的多线程调用同一个函数是一样的处理. dll是给exe打了一块补丁, 打完了这个补丁, 补丁里面跟exe可以看做是一样的.

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧