Кроссплатформенность Threading / Forking-со-статическими переменными в C / C ++ - PullRequest
0 голосов
/ 10 июля 2011

Я пытаюсь написать серверную программу, которая может отслеживать количество экземпляров какого-либо объекта.

В данный момент я использую статическое int, которое увеличивается во время конструктора объекта:

class myObj{
  public:
    static int numOfInstances;
    myObj();
};
int myObj::numOfInstances = 0;

myObj::myObj(){
    this->numOfInstances = ++myObj::numOfInstaces
}

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

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

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

Если с fork не существует нормального решения, какое решение для потоков порекомендуют люди?Я пишу для Linux, но я бы предпочел кросс-платформенное решение.

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Многопроцессорная обработка не является частью стандарта C ++.Однако, если вы находитесь в системе POSIX (где у вас fork()), вы можете получить общей памяти из операционной системы;посмотрите на shmget() семейство функций.Вам понадобится некоторый механизм синхронизации для доступа к общей памяти (например, мьютекс или семафор);они также предоставляются.

Я предлагаю man shm_overview и man sem_overview в качестве отправных точек.

0 голосов
/ 10 июля 2011

Я действительно не знаю, как работает совместное использование ресурсов в системах POSIX (поэтому я не могу сказать вам, просто ли fork() или использовать потоки), но есть портативная библиотека Boost.Thread , в дополнение к pthreads , если вы решите пойти по этому пути.

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

...