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()
|
|
|
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.
|