C ++: как создать локальную / глобальную переменную потока - PullRequest
8 голосов
/ 03 сентября 2010

в этом коде:

int foo() {
   static int x;
}

является x глобальным для всех потоков или локальным в каждом потоке? Или это зависит от флага компилятора и / или компилятора, поэтому я не могу точно понять, что это такое из кода?

Несколько вопросов (все они не зависят от флагов компилятора и компилятора и ОС):

  1. Как я могу создать статическую переменную, которая является глобальной для всех потоков?
  2. Как создать статическую переменную, локальную для каждого потока?
  3. Как я могу создать глобальную переменную, которая является глобальной для всех потоков?
  4. Как создать глобальную переменную, локальную для каждого потока?

Я полагаю, что это не в самом C ++. (Это в C ++ 0x?) Какой-нибудь Boost lib, который может это сделать?

Ответы [ 3 ]

6 голосов
/ 03 сентября 2010

x является глобальным для всех потоков.Всегда независимо от компилятора и / или его флагов.Независимо от того, находится ли это в C ++ 11 или C ++ 03.Поэтому, если вы объявите обычную глобальную или статическую локальную переменную, она будет разделена между всеми потоками.В C ++ 11 у нас будет ключевое слово thread_local.До этого вы можете использовать thread_specific_ptr из Boost.Thread.

1 голос
/ 03 сентября 2010

Вы должны использовать какую-то библиотеку кроссплатформенных потоков (так как вы упомянули независимость от ОС), но с учетом pthreads вы можете сделать.

template <T>
class myVarStorage
{
    static std::map<int, T> store_;
public:
    myVarStorage();
    T getVar();
    void setVar(T);
}

template <T> void myVarStorage::setVar<T>(T var)
{
     store_[static_cast<int>pthread_self()] = var;
}

template <T> T myVarStorage::getVar()
{
     return store_[static_cast<int>pthread_self()]; //throws exception 
}

Я уверен, что код содержит ошибки вэто и должно рассматриваться как псевдокод, так как я псевдопрограммист, когда дело доходит до C ++.:)

1 голос
/ 03 сентября 2010

Быстрые частичные ответы;

(это в C ++ 0x?)

Да. Но зависит и от поддержки вашего компилятора C ++ 0x.

Какой-нибудь Boost lib, который может это сделать?

Boost.Threads . См. поток локального хранилища в нем.

  1. Как я могу создать статическую переменную, которая является глобальной для всех темы?
  2. Как создать статическую переменную, локальную для каждого нить
  3. Как я могу создать глобальную переменную, которая является глобальной для всех темы?
  4. Как я могу создать глобальную переменную, которая является локальной для каждого нить?

Обратите внимание, что обычно static относится к длительности, а global относится к области видимости.

Конструкторы потоков C ++ 0x являются переменными: вы можете передавать любое количество (и тип) аргументов. Все это доступно для вашего std::thread объекта.

#include <thread>

int main()
{
    int foo = 42;
    std::thread t(foo); // copies foo
    std::thread s(&foo); // pass a pointer
    t.join();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...