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

Discussion in 'WASM.BEGINNERS' started by wasmer, Mar 6, 2008.

  1. wasmer

    wasmer New Member

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

    censored New Member

    Blog Posts:
    0
    http://www.boost.org/doc/html/thread.html
     
  3. wasmer

    wasmer New Member

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

    Novi4ek New Member

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

    IceStudent Active Member

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

    wasmer New Member

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

    EvilPhreak New Member

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

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

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

    EvilPhreak New Member

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

    leo Active Member

    Blog Posts:
    0
    wasmer
    см. TlsAlloc\TlsSetValue\TlsGetValue
     
  10. EvilPhreak

    EvilPhreak New Member

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

    leo Active Member

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

    EvilPhreak New Member

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

    Novi4ek New Member

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

    asmfan New Member

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

    wasmer New Member

    Blog Posts:
    0
    Ladno obojdemsia bez etogo, pod windows 98 tls funkcii rabotatj ne budut
     
  16. asmfan

    asmfan New Member

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

    n0name New Member

    Blog Posts:
    0
    asmfan
    статик
     
  18. asmfan

    asmfan New Member

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

    wasmer New Member

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

    IceStudent Active Member

    Blog Posts:
    0
    wasmer
    А
    это по-твоему красиво?