Поддерживает ли стандарт поддержки С++?

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

#include <iostream>
#include <thread>

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

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

    return 0;
}

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

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

Ответы

Ответ 1

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

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

Существует популярная реализация, которая была предложена для повышения, но никогда не была использована для стандартного предложения С++.

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


Однако существует ли способ выполнить функцию 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 для вашего примера.

Ответ 2

Boost начал поддерживать процессы в версии 1.64.0 (апрель 2017 г.).

https://www.boost.org/doc/libs/1_70_0/doc/html/process.html

Тот факт, что это функция Boost, является источником надежды на ее включение в будущий стандарт C++.