Многозадачность не работает в моей программе на C ++ 11 - PullRequest
1 голос
/ 18 января 2012

Как запустить новый поток параллельно, не останавливая основную функцию?

Вот мой код:

void someFunction { while(1);}

int main(){

thead *th = new thead(&someFunction);
thead.join();
return 0;

}

Но программа не останавливается


PS Как запустить поток в параллельном источнике

Ответы [ 5 ]

4 голосов
/ 18 января 2012

В C ++ 11 реализация позволяет предположить, что цикл такого типа завершается .Таким образом, ваш код может быть оптимизирован до нуля вообще.В противном случае, многие законные и ценные оптимизации были бы невозможны, но иногда это может вызывать удивление.

3 голосов
/ 18 января 2012

Программа не может остановиться, так как основной поток вызывает thread.join(), что означает, что она будет ожидать завершения потока "thread", однако при этом вызывается функция, которая никогда не завершится, поскольку она возвращается в бесконечность.

2 голосов
/ 18 января 2012

Ваш thread.join(); ожидает выхода вторичного потока, но поскольку вторичный поток выполняет бесконечный цикл, он никогда не выйдет.

Редактировать: я должен добавить, что стандарт дает достаточно свободы для разрешения потока для выхода, но это не требуется.

1 голос
/ 18 января 2012

Звонок:

thread.join();

явно указывает вашей программе дождаться возврата функции, выполняемой thread. Ваша функция никогда не возвращается, поэтому ваша программа никогда не проходит этот вызов функции. Вы можете запустить дополнительные потоки между созданием потока и соответствующим вызовом join(). Например:

#include <thread>

void someFunction() { for(volatile int x = 0; ; x = x){};}

int main()
{
    std::thread t1(someFunction);
    std::thread t2(someFunction);
    std::thread t3(someFunction);
    t1.join();
    t2.join();
    t3.join();
    return 0;
}

создаст 3 потока, которые абсолютно ничего не делают. Если функции, переданные потокам, возвращаются, это то, что вы хотите сделать.

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

1 голос
/ 18 января 2012

Вы присоединились к циклу while (1).Программа остановится, когда while (1) закончится, т.е.никогда.

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