2016-02-09 3 views
16

Я знаю, что C++ 11 добавила поддержку потоков. Например:Поддерживает ли стандартные службы поддержки C++?

#include <iostream> 
#include <thread> 

void bar() 
{ 
    std::cout << "bar()\n"; 
} 

int main() 
{ 
    std::thread thread(bar); 
    thread.join(); 

    return 0; 
} 

Однако, есть способ, чтобы выполнить функцию bar в отдельном процессе? Если нет, обсуждается ли вопрос о добавлении такой функции?

Примечание: Я знаю о возможности использования независимых от платформы библиотек, и мне просто интересно, поддерживает ли это C++ непосредственно или будет в будущем.

+0

'fork' .......? –

+1

@MarcB Это не стандартная функция C++? Другими словами, он должен быть предоставлен конкретным компилятором, не так ли? –

+6

'fork' не входит в стандартную библиотеку, это функция posix. – ThomasMcLeod

ответ

6

Нет, C++ стандарт (в частности, C++ 11) не имеет понятия процесса (поэтому я не могу дать вам более разумную ссылки здесь как search result из самых популярных и в настоящее время наиболее обновленный сайт документации C++).

Я также не знаю, что поддержка процесса запланирована для следующей стандартной версии C++ - 17 (aka C++ - 1z). По крайней мере, Wikipedia Site не упоминает об этом.

Существует популярный implementation, который был предложен для повышения, но это никогда не было нарисовано для стандартного предложения C++.

Обычно вы не можете писать портативный код для работы на голых металлических системах, где существует только один процесс.


Однако, есть способ, чтобы выполнить функцию bar() в отдельном процессе?

Самый простой вариант, чтобы сделать это, чтобы Откат к fork() и wait(), как указано в POSIX Open Group:

#include <iostream> 
#include <unistd.h> 
#include <sys/wait.h> 

void bar() 
{ 
    std::cout << "bar()\n"; 
}  

int main(int argc, char **argv) 
{ 
    pid_t pid = fork(); 

    if (pid == 0) 
    { 
     // child process 
     bar(); 
    } 
    else if (pid > 0) 
    { 
     // parent process 
     wait(NULL);  
    } 
    else 
    { 
     // fork failed 
     std::cerr << "fork() failed!" << std::endl; 
     return 1; 
    } 


    return 0; 
} 

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

Ну, если вы хотите запустить другую программу, используя функции из семейства функций exec(), это другой вариант использования.

Я рекомендую придерживаться std::thread s для вашего примера.

+0

Образец кода в вопросе только для иллюстрации. Я бы не попытался запустить это в отдельном процессе. –

+1

@JamesAdkison Итак, ваш вопрос заключается в том, чтобы запустить другой исполняемый файл из вашего кода, как я упоминал, с моими подсказками об использовании 'exec()' семейных функций? Единственной функцией, поддерживаемой стандартом C++, является 'std :: system()' AFAIK, но она имеет свои ограничения. –

+1

Примечание: это решение не очень хорошо масштабируется в Windows, что очень медленно для выполнения эквивалента 'fork'. –

Смежные вопросы