Потоки в элементе одиночного C ++ - PullRequest
0 голосов
/ 02 мая 2020

Я проверял, как работать с потоками, и я нашел здесь несколько ответов, и в основном вам нужно передать вызывающему потоку объект и функцию потоку, но в простом синглтоне я не смог сделать это простой кусок кода для работы.

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

Есть мысли / идеи о том, как заставить это работать?

1 Ответ

0 голосов
/ 02 мая 2020

Благодаря @Alex F

ThreadTestAllRelays установлено c, нет необходимости использовать параметр экземпляра для потока. - Alex F

Исправлено !, строка должна выглядеть так:

 std::thread testManagerThread(&TestManager::ThreadTestAllRelays,mSecsPerRelay);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...