【发布时间】:2015-05-08 16:06:39
【问题描述】:
在 Ubuntu 上,我有一个共享库 mylibrary.so,带有一个函数 AlphaFunction。我想使用dlopen 在 C++ 中加载这个函数,然后在两个不同的线程中调用它。但是,这给了我运行时错误,大概是因为两个线程都试图访问存储函数的同一内存。
库本身通过 USB 控制机械臂,我得到的实际运行时错误是:LIBUSB_ERROR_NO_DEVICE returned by the Write operation.
我知道如何使用std::atomic 来处理共享变量,但是共享函数呢?
例如:
void Foo(int (*FooFunction)())
{
while(true)
{
FooFunction();
}
}
void Bar(int (*BarFunction)())
{
while(true)
{
BarFunction();
}
}
int main()
{
void* api_handle = dlopen("mylibrary.so", RTLD_NOW|RTLD_GLOBAL);
int (*MoveRobot)() = (int (*)()) dlsym(api_handle, "Move");
std::thread t1(Foo, MoveRobot);
std::thread t2(Bar, MoveRobot);
t1.join();
t2.join();
return 0;
}
【问题讨论】:
-
你没有用
extern "C"定义MoveRobot。如果您使用的是 C++ 编译器,则它的名称已被修改。见tldp.org/HOWTO/C++-dlopen/thesolution.html#externC -
可能无法正常工作,具体取决于
MoveRobot的内部结构,所以我不会将其作为答案,但您是否尝试通过将调用包装到FooFunction和 @987654332 来限制对函数的访问@与std::mutex? -
@jnbbender 谁在乎
MoveRobot,它是main()的自动变量。我想你的意思是Move在mylibrary.so库中。 -
@WhozCraig 我的道歉
-
这不是因为访问了“存储函数的同一内存”,而是因为它们的 IO 函数不是为并发执行而设计的。或者可能两个调用者都没有正确设置我们看不到的参数,因为这不是实际代码。无论如何,通过 dynaload 同时调用相同的 function 与通过本地定义并没有什么不同。调用者和/或被调用者负责管理并发invoking函数。如果他们不这样做也不支持它,你必须....
标签: c++ multithreading shared-libraries dlopen