если ваши рабочие блоки связаны с процессором, лучше использовать процессы, потому что обычно все потоки в процессе работают на одном и том же ядре (по крайней мере, в Linux).
использование процесса на ядро ЦП гарантирует, что каждый процесс получит реальное ядро ЦП.
Преимущество потоков в том, что ими очень легко делиться между собой состоянием, поэтому если все, что вам действительно нужно, это загрузить файл без блокировки или отправить запрос в базу данных, то потоки будут лучшим вариантом.
на самом деле, я только сейчас нахожусь в процессе написания чего-то, что вам может пригодиться: менеджера, который порождает несколько рабочих процессов и перезапускает их, если они выходят из / kill / dies. он почти готов, так что вот оно:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string>
void termination_handler(int signum)
{
printf("pid %d : signal %d caught in pid %d\n", getpid(), signum, getpid());
kill(0, SIGTERM);
exit(1);
}
int main(int argc ,char** argv)
{
if (argc > 1)
{
printf("pid %d : Worker code running\n", getpid());
sleep(10);
}
else
{
printf("pid %d : manager started\n", getpid());
// manager
const int MAX_INSTANCES = 3;
int numInstances = 0;
struct sigaction new_action;
/* Set up the structure to specify the new action. */
new_action.sa_handler = termination_handler;
sigemptyset(&new_action.sa_mask);
new_action.sa_flags = 0;
sigaction(SIGKILL, &new_action, NULL);
sigaction(SIGTERM, &new_action, NULL);
sigaction(SIGINT, &new_action, NULL);
int status;
int w;
do
{
while (numInstances < MAX_INSTANCES)
{
int pid = fork();
if (pid < 0)
{
printf("fork failed\n");
exit(1);
}
else
{
if (pid == 0)
{
char * const argv1[] = { (char*) argv[0], (char*)"worker",(char *) 0 };
char * const envp1[] = { (char *) 0 };
std::string prog = argv[0];
execve(prog.c_str(), argv1, envp1);
}
else
{
numInstances++;
}
}
}
w = waitpid(0, &status, WUNTRACED | WCONTINUED);
if (w == -1)
{
perror("waitpid");
exit(EXIT_FAILURE);
}
if (WIFEXITED(status))
{
printf("pid %d : child %d exited, status=%d\n",getpid(), w, WEXITSTATUS(status));
numInstances--;
}
else if (WIFSIGNALED(status))
{
printf("pid %d : child %d killed by signal %d\n",getpid(), w, WTERMSIG(status));
numInstances--;
}
else if (WIFSTOPPED(status))
{
printf("pid %d : child %d stopped by signal %d\n",getpid(), w, WSTOPSIG(status));
}
else if (WIFCONTINUED(status))
{
printf("pid %d : child %d continued\n", getpid(), w);
}
}
while (true);
//! WIFEXITED(status) && !WIFSIGNALED(status));
printf("pid %d : manager terminated\n", getpid());
}
return 0;
}