Problem' z wątkami

0

Witam. Piszę wielowątkowy program i mam pewien problem. Oto część kodu, w której tworzę wątki:

    thread inputCheckingThread(&checkInput, &player);
    inputCheckingThread.join();
    thread collisionCheckingThread(&appleCollisionChecking, &apple, &player);
    appleCollisionCheckingThread.join();

Funkcje checkInput() i appleCollsionCheking():

void checkInput(gameData &data, snake &player)
{
}

void appleCollisionChecking(food &apple, snake &player)
{
    while(1)
    {
//
    }
}

Przy kompilacji wywala mi dwa takie same błędy:
''C:\sciezka\functional:1697: błąd: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (snake::)(gameData, Direction)>(snake, gameData, Direction, bool)>'
typedef typename result_of<_Callable(_Args...)>::type result_type;''
Googlowałem i wiem, że chodzi o referencje w konstruktorach wątków. Próbowałem je usuwać, dodawać, używać std::ref(), itp., ale nic nie zadziałało. Możecie mi pomóc?

0
gogolon napisał(a):
thread inputCheckingThread(&checkInput, &player);
inputCheckingThread.join();
thread collisionCheckingThread(&appleCollisionChecking, &apple, &player);
appleCollisionCheckingThread.join();

Pomijając to, że ten kod nie jest poprawny to on po prostu nie ma sensu. Tworzysz wątek, joinujesz, tworzysz kolejny wątek i znowu joinujesz. W konsekwencji otrzymujesz sekwencyjny kod z wielkim narzutem na inicjowaniem/niszczenie wątków.

gogolon napisał(a):

Funkcje checkInput() i appleCollsionCheking():


void checkInput(gameData &data, snake &player)
{
}

void appleCollisionChecking(food &apple, snake &player)
{
while(1)
{
//
}
}

> 
> Przy kompilacji wywala mi dwa takie same błędy:
> ''C:\sciezka\functional:1697: błąd: no type named 'type' in 'class std::result_of<std::_Mem_fn<void (snake::*)(gameData, Direction)>(snake*, gameData, Direction, bool)>'
>        typedef typename result_of<_Callable(_Args...)>::type result_type;''
> Googlowałem i wiem, że chodzi o referencje w konstruktorach wątków. Próbowałem je usuwać, dodawać, używać std::ref(), itp., ale nic nie zadziałało. Możecie mi pomóc?

```cpp
struct foo {
  void bar(const int& buzz) {
    std::cout << buzz;
  }
};

std::thread t(&foo::bar, foo{}, 10);
t.join();
0

Po raz pierwszy bawię się wielowątkowością, dlatego kod może nie mieć sensu :D
Dlaczego umieściłeś foo w strukturze? Moje funkcje są zadeklarowane globalnie. Nie za bardzo wiem jak w takim razie osiągnąć to, żeby kilka funkcji wykonywało się jednocześnie, przy czym każda z nich ma w sobie nieskończoną pętlę.

1
gogolon napisał(a):
thread inputCheckingThread(&checkInput, &player);

Przekazujesz do funkcji jeden parametr zamiast dwóch i w dodatku przekazujesz go przez wskaźniki, więc masz niezgodne typy.
Powinno być:

    thread inputCheckingThread(checkInput, data, player);

lub:

    thread inputCheckingThread(checkInput, ref(data), ref(player));
gogolon napisał(a):
appleCollisionCheckingThread.join();

Wywołanie tej metody nie ma żadnego sensu jeżeli funkcja wątku nigdy się nie kończy, gdyż ta metoda czeka na zakończenie wątku.

0

Błędy nadal są...
Czy jeśli utworzę obiekt thread, to wątek od razu zacznie się wykonywać?

0

Pokaż wiersz w którym masz błąd. - @Pebal

Te błędy nie wskazują na mój kod, tylko na plik functional (będący częścią GNU ISO C++ Library), a dokładnie na te dwie linijki:

typedef typename result_of<_Callable(_Args...)>::type result_type;

[...]

M_invoke(_Index_tuple<_Indices...>)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0