2
在Ubuntu上,我有一個共享庫mylibrary.so
,函數AlphaFunction
。我想用C++加載這個函數,使用dlopen
,然後在兩個不同的線程中調用它。但是,這給我帶來了運行時錯誤,大概是因爲這兩個線程都試圖訪問存儲函數的同一個內存。std ::線程訪問從共享庫加載的函數
庫本身控制通過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++編譯器,則它的名稱已被改名。請參閱http://tldp.org/HOWTO/C++-dlopen/thesolution.html#externC – jiveturkey
根據「MoveRobot」的內部結構可能無法正常工作,所以我不會將此作爲答案,但是您是否嘗試限制訪問該函數通過將調用包裝爲'FooFunction'和'BarFunction'與'std :: mutex?' – user4581301
@jnbbender誰關心'MoveRobot',它是一個自動變量'main()'。我認爲你的意思是''移動''mylibrary.so'庫。 – WhozCraig