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

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

  1. wasmer

    wasmer New Member

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

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    http://www.boost.org/doc/html/thread.html
     
  3. wasmer

    wasmer New Member

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

    Novi4ek New Member

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    wasmer
    __declspec(thread) для переменных, которые должны быть локальными для потока.
     
  6. wasmer

    wasmer New Member

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

    EvilPhreak New Member

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

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

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

    EvilPhreak New Member

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

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    wasmer
    см. TlsAlloc\TlsSetValue\TlsGetValue
     
  10. EvilPhreak

    EvilPhreak New Member

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

    leo Active Member

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

    EvilPhreak New Member

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

    Novi4ek New Member

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

    asmfan New Member

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

    wasmer New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2007
    Сообщения:
    104
    Ladno obojdemsia bez etogo, pod windows 98 tls funkcii rabotatj ne budut
     
  16. asmfan

    asmfan New Member

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

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    asmfan
    статик
     
  18. asmfan

    asmfan New Member

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

    wasmer New Member

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

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    wasmer
    А
    это по-твоему красиво?