由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 问一下可能性,MingW生成的DLL和MSVC生成的DLL两个线程同步
相关主题
遇到 Qt 下undefined reference to "func" 错误有谁知道怎么把matlab和VC联接着一起用? (转载)
C问题,被64bit iPhone搞晕了C++ question
面试题还是不太清楚怎么回答。尤其是8,我用MSVC试了一下,没有问题啊。C++ with gtkmm
C array现在哪个C++ IDE比较好?
一道c++的考古题lifeaswater, please answer question in post 5700
[合集] 面试题还是不太清楚怎么回答。尤其是8,我用MSVC试了一下,没有Qt/Windows 开源版本将支持 VS Express
Help: Another C++ compilation error on GCCsscanf problem in MSVC 7
C++ help: 一个multiple definition problem.听说pointer to member function只支持最多128个virtual functi
相关话题的讨论汇总
话题: dll话题: mingw话题: msvc话题: 线程话题: 同步
进入Programming版参与讨论
1 (共1页)
x**n
发帖数: 1055
1
我有两个windows下的DLL,
一个是Code::blocks加上MingW 4.3.3 编译的DLL
另一个是Visual C++ 2005编译的DLL
都是差分程序,因此想通过类似boost.thread的实现线程同步并且传递数据
因为是不同编译器生成的DLL,所以想问问有没有这个可能实现这两个不同编译器生成
的DLL线程的同步?
因为两个DLL都依赖很多库,所以想要都用同一个编译器去编译(比如都用Visual C++或
者都用MingW编译成功)太困难了
谢谢!
h**********c
发帖数: 4120
2
I assume boost is something like Java.
So you
class NewRun implements Runnable {
NewRun( ... pass parameter){}
run () {
do sync and call your DLL.
}
};
That is the most exciting part auf OO programming.
c*****t
发帖数: 1879
3
简单来说不行。即使跟 thread 无关也问题多多。

【在 x**n 的大作中提到】
: 我有两个windows下的DLL,
: 一个是Code::blocks加上MingW 4.3.3 编译的DLL
: 另一个是Visual C++ 2005编译的DLL
: 都是差分程序,因此想通过类似boost.thread的实现线程同步并且传递数据
: 因为是不同编译器生成的DLL,所以想问问有没有这个可能实现这两个不同编译器生成
: 的DLL线程的同步?
: 因为两个DLL都依赖很多库,所以想要都用同一个编译器去编译(比如都用Visual C++或
: 者都用MingW编译成功)太困难了
: 谢谢!

x**n
发帖数: 1055
4
有没有实现了的简单例子?谢谢

【在 h**********c 的大作中提到】
: I assume boost is something like Java.
: So you
: class NewRun implements Runnable {
: NewRun( ... pass parameter){}
: run () {
: do sync and call your DLL.
: }
: };
: That is the most exciting part auf OO programming.

h**********c
发帖数: 4120
5
Sorry, no example,
But, what is the difference of start your own threads, call the DLLs, sync
the threads yourself.
Take some time Z-turn, Z-turn.

【在 x**n 的大作中提到】
: 有没有实现了的简单例子?谢谢
b*d
发帖数: 75
6
if interprocess, it may be ok.
if interthread, mission impossible. WinGW and VS are totally incompatible,
you won't be able to link your code with the two dll's.

【在 x**n 的大作中提到】
: 我有两个windows下的DLL,
: 一个是Code::blocks加上MingW 4.3.3 编译的DLL
: 另一个是Visual C++ 2005编译的DLL
: 都是差分程序,因此想通过类似boost.thread的实现线程同步并且传递数据
: 因为是不同编译器生成的DLL,所以想问问有没有这个可能实现这两个不同编译器生成
: 的DLL线程的同步?
: 因为两个DLL都依赖很多库,所以想要都用同一个编译器去编译(比如都用Visual C++或
: 者都用MingW编译成功)太困难了
: 谢谢!

x**n
发帖数: 1055
7
我用MSVC的LoadLibrary和GetProcAddress可以打开另一个MingW的DLL并且调用MingW
DLL的函数没问题,但是要同步就不行,呵呵

【在 b*d 的大作中提到】
: if interprocess, it may be ok.
: if interthread, mission impossible. WinGW and VS are totally incompatible,
: you won't be able to link your code with the two dll's.

b***i
发帖数: 3043
8
那就是说你同步部分写错了。很大的可能是你的那个semaphore根本就是生成了两个不
同的变量。
你要详细说一下,你是怎么同步的。你是把semaphore的指针传递给dll吗?

【在 x**n 的大作中提到】
: 我用MSVC的LoadLibrary和GetProcAddress可以打开另一个MingW的DLL并且调用MingW
: DLL的函数没问题,但是要同步就不行,呵呵

x**n
发帖数: 1055
9
的确是传的指针,但是没有用semaphore, boost thread好像没有这个东西吧
是这样的,假设有msvc.dll和mingw.dll
又用VC8.0写了个主程序
typedef struct
{
boost::barrier* brr;
boost::mutex* mtx;
boost::condition* cv;
} BT_PARAM;
main()
{
...
BT_PARAM* bt_param;
bt_param=new BT_PARAM;
接下来初始化bt_param;
接下来loadlibrary,打开msvc.dll和mingw.dll
产生两个线程
boost::thread* t_msvc=new boost::thread(p_msvc,bt_param);
boost::thread* t_mingw=new boost::thread(p_mingw,bt_param);
...
}
然后在msvc.dll.cpp中加上这么一段:
...
bt_param->brr->wait();
...
同样在在mingw.dll.cpp中加上这么一段:
...
bt_param->brr->wait();
...
但是一执行到bt_param->brr->wait();就出错,说我的main.exe停止运行了

【在 b***i 的大作中提到】
: 那就是说你同步部分写错了。很大的可能是你的那个semaphore根本就是生成了两个不
: 同的变量。
: 你要详细说一下,你是怎么同步的。你是把semaphore的指针传递给dll吗?

b***i
发帖数: 3043
10
还不是很清楚你同步的意思。到底要做什么?被同步的两个线程为什么要同步?

【在 x**n 的大作中提到】
: 的确是传的指针,但是没有用semaphore, boost thread好像没有这个东西吧
: 是这样的,假设有msvc.dll和mingw.dll
: 又用VC8.0写了个主程序
: typedef struct
: {
: boost::barrier* brr;
: boost::mutex* mtx;
: boost::condition* cv;
: } BT_PARAM;
: main()

相关主题
[合集] 面试题还是不太清楚怎么回答。尤其是8,我用MSVC试了一下,没有有谁知道怎么把matlab和VC联接着一起用? (转载)
Help: Another C++ compilation error on GCCC++ question
C++ help: 一个multiple definition problem.C++ with gtkmm
进入Programming版参与讨论
x**n
发帖数: 1055
11
两个线程都是基于有限差分法的(finite difference),也就是t_msvc和t_mingw都是按照各自的时间步行进(time marching),每步开始前,两个线程之间要停下来交换一下各自的数据,然后开始各自的计算,然后等到下一步开始前,两个线程又要停下来交换数据,以此类推,因此线程同步就很重要了

【在 b***i 的大作中提到】
: 还不是很清楚你同步的意思。到底要做什么?被同步的两个线程为什么要同步?
b***i
发帖数: 3043
12
再具体点。每个线程内都做了什么,详细说说。有循环吗?

按照各自的时间步行进(time marching),每步开始前,两个线程之间要停下来交换一
下各自的数据,然后开始各自的计算,然后等到下一步开始前,两个线程又要停下来交
换数据,以此类推,因此线程同步就很重要了

【在 x**n 的大作中提到】
: 两个线程都是基于有限差分法的(finite difference),也就是t_msvc和t_mingw都是按照各自的时间步行进(time marching),每步开始前,两个线程之间要停下来交换一下各自的数据,然后开始各自的计算,然后等到下一步开始前,两个线程又要停下来交换数据,以此类推,因此线程同步就很重要了
x**n
发帖数: 1055
13
两个线程都是按照时间步dt循环
t_msvc线程:
for(t=0;t {
bt_param->brr->wait()
//这里停下来同步传信息给t_mingw
bt_param->brr->wait()
//到这里需要同步的内容结束
t_msvc自己的计算...
}
t_mingw线程:
for(t=0;t {
bt_param->brr->wait()
//这里停下来同步传信息给t_msvc
bt_param->brr->wait()
//到这里需要同步的内容结束
t_mingw自己的计算...
}
基本就是上面的框架,不知是不是解释清楚了,谢谢!

【在 b***i 的大作中提到】
: 再具体点。每个线程内都做了什么,详细说说。有循环吗?
:
: 按照各自的时间步行进(time marching),每步开始前,两个线程之间要停下来交换一
: 下各自的数据,然后开始各自的计算,然后等到下一步开始前,两个线程又要停下来交
: 换数据,以此类推,因此线程同步就很重要了

b***i
发帖数: 3043
14
我来说说我的理解吧,是不是你想做的
t_msvc线程:
for(t=0;t {
这里传递这一步需要的信息给t_mingw;
等待同步信号;
t_msvc自己的计算...
}
t_mingw线程:
for(t=0;t {
这里传递这一步需要的信息给t_msvc;
等待同步信号;
t_mingw自己的计算...
}

【在 x**n 的大作中提到】
: 两个线程都是按照时间步dt循环
: t_msvc线程:
: for(t=0;t: {
: bt_param->brr->wait()
: //这里停下来同步传信息给t_mingw
: bt_param->brr->wait()
: //到这里需要同步的内容结束
: t_msvc自己的计算...
: }

x**n
发帖数: 1055
15
是,基本上就是这样一个结构,至于同步时信号传递先后关系暂时不用考虑,如果是同
一个编译器编译的两个DLL,用boost.thread毫无问题,但是不同编译器产生的,就不行
了,呵呵

【在 b***i 的大作中提到】
: 我来说说我的理解吧,是不是你想做的
: t_msvc线程:
: for(t=0;t: {
: 这里传递这一步需要的信息给t_mingw;
: 等待同步信号;
: t_msvc自己的计算...
: }
: t_mingw线程:
: for(t=0;t
b***i
发帖数: 3043
16
那你就做个函数专门负责wait,把函数指针传入每个线程。这样,只要他们能找到这个
函数,由这个函数统一负责调用wait,而不是分别两个编译器写不同的代码,你懂了吗
?这个函数是主函数中的。

【在 x**n 的大作中提到】
: 是,基本上就是这样一个结构,至于同步时信号传递先后关系暂时不用考虑,如果是同
: 一个编译器编译的两个DLL,用boost.thread毫无问题,但是不同编译器产生的,就不行
: 了,呵呵

x**n
发帖数: 1055
17
谢谢,好像有点明白您说的思路,不过是否能稍微详细展开一下实现的细节?
就是在mingw.dll.c和msvc.dll.c中把GetProcAddress得到的
ptr_func_mingw和ptr_func_msvc作为参数传入用其中一个编译器写的wait()?然后在
wait中实现所有的同步操作?
我是不是应该有wait(ptr_func_mingw)和wait(ptr_func_msvc)这样一个函数?
有没有这方面成功的例子?
非常感谢!!

【在 b***i 的大作中提到】
: 那你就做个函数专门负责wait,把函数指针传入每个线程。这样,只要他们能找到这个
: 函数,由这个函数统一负责调用wait,而不是分别两个编译器写不同的代码,你懂了吗
: ?这个函数是主函数中的。

b***i
发帖数: 3043
18
我建议你做个试验,写两个简单的dll,一个用mingW, 一个msvc, 在里面做循环,等待
,同步。主程序开始两个线程后要等待join吧。
如果出错,用下面的方案再试试。在dll中都定义startThread(.......,
aFunctionPointertoWait)
然后在主程序中定义一个函数,用来wait,你那个boost的barrier也在主程序中声明,
通过这个函数来等待。就是说,这个barrier的等待不是分别在两个dll中,而是统一通
过主程序的唯一的函数来做,避免不同编译器不同的实现不兼容。wait那个函数,可以
增加一些参数,你可以打印看看谁呼叫你,那一行,要增加很多调试信息。

【在 x**n 的大作中提到】
: 谢谢,好像有点明白您说的思路,不过是否能稍微详细展开一下实现的细节?
: 就是在mingw.dll.c和msvc.dll.c中把GetProcAddress得到的
: ptr_func_mingw和ptr_func_msvc作为参数传入用其中一个编译器写的wait()?然后在
: wait中实现所有的同步操作?
: 我是不是应该有wait(ptr_func_mingw)和wait(ptr_func_msvc)这样一个函数?
: 有没有这方面成功的例子?
: 非常感谢!!

x**n
发帖数: 1055
19
谢谢建议,正在努力试验中!!!

【在 b***i 的大作中提到】
: 我建议你做个试验,写两个简单的dll,一个用mingW, 一个msvc, 在里面做循环,等待
: ,同步。主程序开始两个线程后要等待join吧。
: 如果出错,用下面的方案再试试。在dll中都定义startThread(.......,
: aFunctionPointertoWait)
: 然后在主程序中定义一个函数,用来wait,你那个boost的barrier也在主程序中声明,
: 通过这个函数来等待。就是说,这个barrier的等待不是分别在两个dll中,而是统一通
: 过主程序的唯一的函数来做,避免不同编译器不同的实现不兼容。wait那个函数,可以
: 增加一些参数,你可以打印看看谁呼叫你,那一行,要增加很多调试信息。

h**********c
发帖数: 4120
20
I review the post.
It seems you probably can't do this, cause the underling thread library for
MingW/cygwin etc is pthread. MSVC uses thread library Microsoft wrote.
So in your Ming code and MSVC, do they include the same boost library.

【在 x**n 的大作中提到】
: 谢谢建议,正在努力试验中!!!
x**n
发帖数: 1055
21
我已经实现此mingw和msvc线程同步的功能,都用的boost.thread,现在在win和linux
上都可以编译运行,非常感谢bihai的提示

for

【在 h**********c 的大作中提到】
: I review the post.
: It seems you probably can't do this, cause the underling thread library for
: MingW/cygwin etc is pthread. MSVC uses thread library Microsoft wrote.
: So in your Ming code and MSVC, do they include the same boost library.

1 (共1页)
进入Programming版参与讨论
相关主题
听说pointer to member function只支持最多128个virtual functi一道c++的考古题
How to use volatile in c++?[合集] 面试题还是不太清楚怎么回答。尤其是8,我用MSVC试了一下,没有
才发现gcc的parallel modeHelp: Another C++ compilation error on GCC
white board coding的时候如果遇到hash tableC++ help: 一个multiple definition problem.
遇到 Qt 下undefined reference to "func" 错误有谁知道怎么把matlab和VC联接着一起用? (转载)
C问题,被64bit iPhone搞晕了C++ question
面试题还是不太清楚怎么回答。尤其是8,我用MSVC试了一下,没有问题啊。C++ with gtkmm
C array现在哪个C++ IDE比较好?
相关话题的讨论汇总
话题: dll话题: mingw话题: msvc话题: 线程话题: 同步