делаю тут многопоточную версию своей программы и как новичок в этом не знаю ответа на простейший вопрос. суть вопроса в следующем: переделываемая программа имеет кучу статических переменных, которые напрямую использует куча функций, которые должны вызываться из ThreadProc как эти переменные сделать глобальными для потока, то есть чтобы их видели эти функции? их надо объединить в структуру и передать CreateThread?
Ничего с ними ненадо делать, они и так видны всем потокам. Другое дело что для работы с ними может понадобиться синхронизация например с помощью критических секций.
мне не надо чтобы они были видны всем потокам, мне как раз надо чтобы они были видны только в одном потоке, но всем функциям этого потока, то есть быть глобальными для потока можно пример кода?
wasmer Код (Text): __declspec(thread) int MyVar; MyVar = 1 В случае такого кода MyVar будет уникальной у каждого потока. они и так глобальные и функции и так будут их видеть. так и не понятно что ты хочешь сделать. Функция понятие не потока. Поток это просто ветка исполнения. И что означает "видны только в одном потоке". Область видимости это блочное понятие. Если сами переменные не доступны в области видимости основной функции потока, то конечно надо передавать указатель на структуру, которая содержит либо указатели либо сами нужные данные.
А __declspec(thread) надо юзать если каждому из потоков нужна собственная копия данной переменной, связанной с этим потоком.
leo Ну это в общем более сложно и ему нах не надо. Может быть как вариант использование динамической локальной памяти потока, хотя преимуществ перед __declspec(thread) я в данном случае не вижу никаких, лишь усложнение. Как мне кажется эти функции существуют в тех случаях, когда компилятор не поддерживает встроенную работу с TLS.
По-моему самый простой вариант это сделать массивы этих переменных и функции передавать функции потока указатель на соотв. переменную или смещение в массиве, во всяком случае это решение универсальное.
Вот вы мне скажите: зачем в общем случае использовать TLS если стековые локальные переменные уникальны для каждого потока (как и сам стек)? Я в упор не пойму зачем нужно локальное хранилище потоков ака TLS /callback"и не рассматриваем)/ и что можно в нём хранить чего нельзя в локальных переменных.
wasmer Будут и в 95й работать (если не в 3.1 даже), только вот мой вопрос в силе ещё. Кто-нибудь прояснит?
n0name Угум, точно. Слоты ТЛС будут хранится в независимости от существования и/или других состояний объектов-потоков, пока явно не будут высвобождены (если динамические). Прояснилось.
msdn об этом умалчивает но всё равно вызывать TlsGetValue для доступа к каждой переменной не очень-то красиво IMHO