C / C ++: дублирование цикла main () во многих потоках - PullRequest
1 голос
/ 27 июля 2010

У меня есть эта "интересная" проблема. У меня есть этот старый код, который выглядит как

int main()
{
  while(true) {
    doSomething();
 }
}

Я хотел бы дублировать этот doSomething () во многих потоках, чтобы теперь main () выглядела как

int main() {
  runManyThreads(threadEntry)
}

void threadEntry() {
   while(true) {
    doSomething();
  }
}

Проблема в том, что doSomething () имеет доступ ко многим глобальным и статическим переменным, и я не могу изменить его код. Есть ли хитрость для дублирования этих статических переменных, чтобы у каждого потока был свой набор? (что-то вроде локального хранилища потока, но без влияния на doSomething ()) .. Я использую VisualC ++

Ответы [ 3 ]

4 голосов
/ 27 июля 2010

Короче говоря, нет, по крайней мере, не так (как я бы назвал) разумно.

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

1 голос
/ 27 июля 2010

Не проверено, но я думаю, что вы можете сделать что-то вроде:

#define threadlocal __declspec(thread)

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

0 голосов
/ 27 июля 2010

Ваша лучшая ставка - локальное хранилище потока .

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