Dll 多线程变量传递,临界区?

Lujiafeng0203 2018-05-23 01:42:37
问题描述:

两个dll, dll 1,dll 2;dll 1有一个导出函数AB;
dll 1实现对AB函数中的变量赋值;然后dll2中导入函数AB,并获取这些变量值。

函数调用运行ok.

但是: 当dll1中加入文件File的读取操作时,函数AB在dll2中运行不正确,这些变量值都是0(很奇怪)。
dll 1中不加入文件File的读取操作时,dll2中运行正常。

我的一些怀疑,有两种可能情形,也不知道对不对:

1. 当dll 1读取File文件时,可能耗时比较耗时,可能有进程处理dll1(对函数AB及变量进行赋值);同时,另外一个进程处理dll 2,导致多线程安全、冲突的问题。
2. 由于dll 1比较耗时(读取文件),dll2在调用函数AB时,导致超时?所以那些变量都从缓存中调用了(因为所有变量值为0)

考虑用临界区来保证多线程调用安全,但是这两个dll如何用临界区来实现?还是有其他更好的方法。这两个dll都不是main函数.
试过全局数组来传递 共享这些变量,也是同样的问题。
...全文
769 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lujiafeng0203 2018-05-23
  • 打赏
  • 举报
回复
尝试把导出函数:变为指针函数传递 double __declspec(dllexport) APIENTRY AB (int j); 变为指针函数导出 double __declspec(dllexport) APIENTRY *AB (int j); 编译器报错:左侧修饰符:不能修改指向数据的指针。难道指针函数不能导出??
Lujiafeng0203 2018-05-23
  • 打赏
  • 举报
回复
这种情况下,指针,地址传值逻辑上好像不行
满衣兄 2018-05-23
  • 打赏
  • 举报
回复
参数用引用或者指针传值就可以了
赵4老师 2018-05-23
  • 打赏
  • 举报
回复
《Windows核心编程》
Lujiafeng0203 2018-05-23
  • 打赏
  • 举报
回复
代码比较长,我简单写个逻辑: dll 1: 导出函数AB如下,函数process也是导出函数 全局变量 int p1,p2,p3; double __declspec(dllexport) APIENTRY AB (int j); { switch (j) case 1: return p1; break; case 2: return p2; break; case 3: return p3; break; default: return 0; break; } double __declspec(dllexport) APIENTRY Process() { p1=2; p2=3;p3=4; File *in; fopen(in); fclose(in); return 0; } dll 2:中 导入函数AB double __declspec(dllimport) APIENTRY AB(int j); double __declspec(dllexport) APIENTRY get_data() { int pp1,pp2,pp3; pp1=AB(1);pp2=AB(2);pp3=AB(3); return 0; } 问题是:把File那一段fopen,fclose去掉,dll2中pp1,pp2,pp3变量都正常;加上File读取操作后,pp1,pp2,pp3都是0,很奇怪;临界区能处理这种情况吗? 还是有其他变量传递方法,试过用全局数组,同样的问题。
满衣兄 2018-05-23
  • 打赏
  • 举报
回复
上代码

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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