Как начать новый поток для процедуры для объекта члена - PullRequest
1 голос
/ 02 сентября 2010

Я пытаюсь запустить метод из main () как новый поток с pthread:

int main(int argc, char** argv) {
    pthread_t shipGeneratorThread;
    Port portMelbourne;

    pthread_create(&shipGeneratorThread, NULL, portMelbourne.generateShips(), NULL);

    return (EXIT_SUCCESS);
}

В классе Port есть функция, которая генерирует корабль:

void Port::generateShips() {
    //Generate 1 cargo ship every 2.5 hours
    bool stop = false;

    while(!stop) {
        if(numberOfShipsInBay < 20) {
            Ship ship;
            ship.setTicket(numberOfShipsInBay);
            shipsWaitingToDock[numberOfShipsInBay] = ship;
            term.displayMessage("A new ship has entered the port");
            numberOfShipsInBay++;
        } else {
            term.displayMessage("A ship has been sent to another port");
        }
        usleep(FIVE_MINUTES * 30); //2.5 hours simulated time
    }
}

Но компилятор выдает ошибку «недопустимое использование выражения void» для функции pthread create.

Я новичок в C ++ и многопоточности, есть идеи?

Ответы [ 3 ]

1 голос
/ 02 сентября 2010

вы должны использовать статический метод в этом случае и да, посмотрите в man pthread_create. Подпись функции значительна.

Также, если вы создадите поток, как показывает ваш код, он будет прерван, как только выйдет main (). Вам нужно дождаться завершения потока. Я приведу пример ниже. Это не идеально, но кажется достаточно хорошим для демонстрации.

Обратите внимание на переход статического -> нестатического метода при обработке начала потока. Это общий подход (хотя и не единственный возможный).

#include <stdio.h>
#include <pthread.h>

class Test {
    public:
        static void* Run(void* me) {
            static_cast<Test*>(me)->RunMe();
            return NULL;
        }

    private:
        void RunMe() {
            printf("%p: %p is running.\n", pthread_self(), this);
        }
};

int main() {

    pthread_t tid;
    Test test;

    printf("%p: creating thread for %p is running.\n", pthread_self(), &test);
    pthread_create(&tid, NULL, Test::Run, &test);
    printf("%p: waiting %p to finish.\n", pthread_self(), &test);

    // In real code you should check 'create' operation result.
    pthread_join(tid, NULL);
    printf("%p: OK, exiting\n", pthread_self());

    return 0;
}
1 голос
/ 02 сентября 2010

Вам нужно «static void * generateShips (void *)» и запустить с «pthread_create (& shipGeneratorThread, NULL, Port :: generateShips, NULL); ».

Привет.

0 голосов
/ 02 сентября 2010
/* you need a wrapper function like this, it can be also a static method of some class */
void *GenerateShipsThread(void *port)
{
    /* do desired action */
    reinterpret_cast<Port*>(port)->generateShips();

    /* destroy Port object here or somewhere else */
    delete reinterpret_cast<Port*>(port);

    return NULL;
}

int main(int argc, char** argv) {
    pthread_t shipGeneratorThread;

    /* Port object is passed to the thread so you don't want it to be
     * destoyed when this function returns - create it on the heap */
    Port *portMelbourne = new Port();

    pthread_create(&shipGeneratorThread, NULL, GenerateShipsWrapper, portMelbourne);

    return (EXIT_SUCCESS);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...