Я проверял, как работать с потоками, и я нашел здесь несколько ответов, и в основном вам нужно передать вызывающему потоку объект и функцию потоку, но в простом синглтоне я не смог сделать это простой кусок кода для работы.
class TestManager {
private:
TestManager() { /*constructor*/ }
static void ThreadTestAllRelays(int mSecsPerRelay) {
std::cout << "testing relays threaded" << mSecsPerRelay << std::endl;
}
public:
void TestAllRelays(int mSecsPerRelay);
static TestManager GetInstance() {
static TestManager instance; // Guaranteed to be destroyed.
return instance; // Instantiated on first use.
}
TestManager(TestManager const&) = delete;
void operator=(TestManager const&) = delete;
};
//TestManager.cpp
void TestManager::TestAllRelays(int mSecsPerRelay) {
// * * * * * CREATING THE THREAD HERE GENERATES THE ERRROR * * * * *
std::thread testManagerThread(&TestManager::ThreadTestAllRelays,
TestManager::GetInstance(),
mSecsPerRelay);
if(testManagerThread.joinable())
testManagerThread.detach();
}
// main.cpp
int main(int arch, char* argv[]) {
TestManager::GetInstance().TestAllRelays();
}
Как вы можете видеть, у меня просто есть синглтон, и я вызываю поток внутри одного из методов синглтона после его вызова.
У меня есть пытался выяснить, почему это не работает, и не смог понять, почему. Вот ошибка, которую выдает компилятор
In file included from /usr/include/c++/6/thread:39:0,
from Core/TestManager.h:13,
from Core/TestManager.cpp:1:
/usr/include/c++/6/functional: In instantiation of ‘struct std::_Bind_check_arity<void (*)(int), TestManager&, int&>’:
/usr/include/c++/6/functional:1398:12: required from ‘struct std::_Bind_simple_helper<void (*)(int), TestManager&, int&>’
/usr/include/c++/6/functional:1412:5: required by substitution of ‘template<class _Callable, class ... _Args> typename std::_Bind_simple_helper<_Func, _BoundArgs>::__type std::__bind_simple(_Callable&&, _Args&& ...) [with _Callable = void (*)(int); _Args = {TestManager&, int&}]’
/usr/include/c++/6/thread:138:26: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (*)(int); _Args = {TestManager&, int&}]’
Core/TestManager.cpp:16:111: required from here
/usr/include/c++/6/functional:1270:7: error: static assertion failed: Wrong number of arguments for function
static_assert(sizeof...(_BoundArgs) == sizeof...(_Args),
^~~~~~~~~~~~~
/usr/include/c++/6/functional: In instantiation of ‘struct std::_Bind_simple<void (*(TestManager, int))(int)>’:
/usr/include/c++/6/thread:138:26: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (*)(int); _Args = {TestManager&, int&}]’
Core/TestManager.cpp:16:111: required from here
/usr/include/c++/6/functional:1365:61: error: no type named ‘type’ in ‘class std::result_of<void (*(TestManager, int))(int)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^~~~~~~~~~~
/usr/include/c++/6/functional:1386:9: error: no type named ‘type’ in ‘class std::result_of<void (*(TestManager, int))(int)>’
_M_invoke(_Index_tuple<_Indices...>)
^~~~~~~~~
Makefile:48: recipe for target 'obj/TestManager.o' failed
make: *** [obj/TestManager.o] Error 1
Есть мысли / идеи о том, как заставить это работать?