Использование fork для выполнения нескольких команд - PullRequest
0 голосов
/ 21 июня 2011

У меня есть список указателей классов. У меня есть функция, которая вызывает метод из этих указателей. Каждый указатель в списке является производным классом от основного класса. Что я сейчас делаю, так это перебираю список и вызываю метод первого указателя в списке, ждем его завершения, затем переходим к указателю объекта второго класса, вызываем метод и так далее.

Теперь у меня около 20 производных классов, и для завершения этого списка требуется вечность. Поэтому я хотел использовать fork для выполнения, возможно, 4-5 методов класса одновременно, чтобы весь процесс был настолько быстрым ..

list<Myclass *> check;

myfunc(list<Myclass *> check)
{
     for(list<Myclass*>::iterator a= check.begin();a!=check.end();a++)
          (*a)->run();
}

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

Ответы [ 4 ]

1 голос
/ 21 июня 2011

Да, вы можете использовать fork () для выполнения некоторой работы в дочернем потоке. Однако, как только дочерний процесс завершит выполнение своей работы, он вернется, и вы не будете обмениваться данными между ними. Я не совсем понимаю вашу реализацию, но если целью является порождение некоторых процессов для выполнения какой-то дополнительной работы, тогда это выглядит нормально, но вы, вероятно, хотите поток, а не fork.

0 голосов
/ 21 июня 2011

Итак, я хотел использовать fork для выполнения, возможно, 4-5 методов класса одновременно, чтобы весь процесс был настолько быстрым ..

Как уже упоминали многие другие, вывероятно, хотите использовать темы, а не форк здесь.С помощью fork создается намного больше накладных расходов, чем с созданием нового потока.

То, что другие не сказали, это то, что создание потока или процесса не гарантирует ускорение.Например, вы можете получить замедление, а не ускорение, если вы породите гораздо больше потоков, связанных с процессором, чем количество доступных процессоров.Что происходит, так это то, что каждый из этих потоков конкурирует с остальными за свою очередь на ограниченное количество процессоров.Поток будет запущен немного времени, а затем будет заменен на другой.

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

0 голосов
/ 21 июня 2011

Вы не передаете память обратно с помощью fork. Вы, вероятно, хотите нить. Вот как это сделать:

int i = 0;
int n = 4; //or 5;

list<Myclass> check; // You can't use pointers here though, as the memory is not shared.

myfunc(list<Myclass> check)
{
     for(list<Myclass>::iterator a= check.begin();a!=check.end();a++) {
          if(i >= n) {
              wait();
          } else {
              if(fork() == 0) {
                  a->run();
                  exit(0);
              } else {
                  i++;
              }
          }
     }

     // Prevent a voodoo priest from making zombies of these processes.
     while(i-->0) wait();
}
0 голосов
/ 21 июня 2011

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

Кроме того, разветвление процесса приводит к некоторому снижению производительности.

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