вопрос по потокам

Тема в разделе "WASM.BEGINNERS", создана пользователем wasmer, 6 мар 2008.

  1. wasmer

    wasmer New Member

    Публикаций:
    0
    делаю тут многопоточную версию своей программы и как новичок в этом не знаю ответа на простейший вопрос.
    суть вопроса в следующем:
    переделываемая программа имеет кучу статических переменных, которые напрямую использует куча функций, которые должны вызываться из ThreadProc
    как эти переменные сделать глобальными для потока, то есть чтобы их видели эти функции?
    их надо объединить в структуру и передать CreateThread?
     
  2. censored

    censored New Member

    Публикаций:
    0
    http://www.boost.org/doc/html/thread.html
     
  3. wasmer

    wasmer New Member

    Публикаций:
    0
    нашёл похожий вопрос, вот ответ на него
    может кто-нить подкинет пример использования этой структуры?
     
  4. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    Ничего с ними ненадо делать, они и так видны всем потокам. Другое дело что для работы с ними может понадобиться синхронизация например с помощью критических секций.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    wasmer
    __declspec(thread) для переменных, которые должны быть локальными для потока.
     
  6. wasmer

    wasmer New Member

    Публикаций:
    0
    мне не надо чтобы они были видны всем потокам, мне как раз надо чтобы они были видны только в одном потоке, но всем функциям этого потока, то есть быть глобальными для потока
    можно пример кода?
     
  7. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    wasmer
    Код (Text):
    1. __declspec(thread) int MyVar;
    2. MyVar = 1
    В случае такого кода MyVar будет уникальной у каждого потока.

    они и так глобальные и функции и так будут их видеть. так и не понятно что ты хочешь сделать.

    Функция понятие не потока. Поток это просто ветка исполнения. И что означает "видны только в одном потоке". Область видимости это блочное понятие. Если сами переменные не доступны в области видимости основной функции потока, то конечно надо передавать указатель на структуру, которая содержит либо указатели либо сами нужные данные.
     
  8. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    А __declspec(thread) надо юзать если каждому из потоков нужна собственная копия данной переменной, связанной с этим потоком.
     
  9. leo

    leo Active Member

    Публикаций:
    0
    wasmer
    см. TlsAlloc\TlsSetValue\TlsGetValue
     
  10. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    leo
    Ну это в общем более сложно и ему нах не надо. Может быть как вариант использование динамической локальной памяти потока, хотя преимуществ перед __declspec(thread) я в данном случае не вижу никаких, лишь усложнение. Как мне кажется эти функции существуют в тех случаях, когда компилятор не поддерживает встроенную работу с TLS.
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Ес-но. Но автор еще ничего не сказал о компиляторе и вопрос задал не в разделе LANG.C
     
  12. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    leo
    В общем да. Это я привык, если CreateThread то VC++ =)
     
  13. Novi4ek

    Novi4ek New Member

    Публикаций:
    0
    По-моему самый простой вариант это сделать массивы этих переменных и функции передавать функции потока указатель на соотв. переменную или смещение в массиве, во всяком случае это решение универсальное.
     
  14. asmfan

    asmfan New Member

    Публикаций:
    0
    Вот вы мне скажите: зачем в общем случае использовать TLS если стековые локальные переменные уникальны для каждого потока (как и сам стек)?
    Я в упор не пойму зачем нужно локальное хранилище потоков ака TLS /callback"и не рассматриваем)/ и что можно в нём хранить чего нельзя в локальных переменных.
     
  15. wasmer

    wasmer New Member

    Публикаций:
    0
    Ladno obojdemsia bez etogo, pod windows 98 tls funkcii rabotatj ne budut
     
  16. asmfan

    asmfan New Member

    Публикаций:
    0
    wasmer
    Будут и в 95й работать (если не в 3.1 даже), только вот мой вопрос в силе ещё. Кто-нибудь прояснит?
     
  17. n0name

    n0name New Member

    Публикаций:
    0
    asmfan
    статик
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    n0name
    Угум, точно. Слоты ТЛС будут хранится в независимости от существования и/или других состояний объектов-потоков, пока явно не будут высвобождены (если динамические). Прояснилось.
     
  19. wasmer

    wasmer New Member

    Публикаций:
    0
    msdn об этом умалчивает
    но всё равно вызывать TlsGetValue для доступа к каждой переменной не очень-то красиво IMHO
     
  20. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    wasmer
    А
    это по-твоему красиво?