Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Примерный ученик от Январь 22, 2011, 09:11



Название: Как это происходит?
Отправлено: Примерный ученик от Январь 22, 2011, 09:11
Есть основной поток и несколько нитей.
Они используют одну и ту же процедуру обработки данных.
Как это происходит?
Для каждого вызова создается своя копия процедуры в куче или все они пользуют один и тот же кусок памяти?
Что будет при одновременном обращении к процедуре? ???


Название: Re: Как это происходит?
Отправлено: UVV от Январь 22, 2011, 09:26
Если:
1) функция использует указатель на контекст нити
2) функция не использует статических и глобальных переменных
3) функция не использует других не thread-safe функций
то всё будет нормально )


Название: Re: Как это происходит?
Отправлено: Примерный ученик от Январь 22, 2011, 09:37
1) функция использует указатель на контекст нити

Это что означает?


Название: Re: Как это происходит?
Отправлено: UVV от Январь 22, 2011, 10:29
Контекстом называют данные, которые использует нить. Суть в том, чтобы для каждой нити это были свои данные.
Наиболее эффективнее это сделать, используя указатель на какую либо структуру.


Название: Re: Как это происходит?
Отправлено: Igors от Январь 22, 2011, 10:48
Есть основной поток и несколько нитей.
Они используют одну и ту же процедуру обработки данных.
Как это происходит?
Для каждого вызова создается своя копия процедуры в куче или все они пользуют один и тот же кусок памяти?
Что будет при одновременном обращении к процедуре? ???
Кусок памяти (лучше сказать "кода") один и тот же. У каждой нитки свой стек, т.е. каждая заходит в ф-цию со "своими" аргументами и возвращает "свои" значения. А все остальные переменные общие (как глобальные так и в куче). Программист ответственен за все проблемы возникающие при "совместном" использовании этих данных.

"Контекст нити" по существу тот же "аргумент" (в конце концов метод это просто ф-ция с неявным аргументом this)


Название: Re: Как это происходит?
Отправлено: Примерный ученик от Январь 22, 2011, 10:59
Всем спасибо ;D
Понял


Название: Re: Как это происходит?
Отправлено: SASA от Январь 24, 2011, 12:20
Контекстом называют данные, которые использует нить. Суть в том, чтобы для каждой нити это были свои данные.
Наиболее эффективнее это сделать, используя указатель на какую либо структуру.
Судя по ответу, у Вас есть опыт многопоточного программирования на WIN API :)


Название: Re: Как это происходит?
Отправлено: UVV от Январь 24, 2011, 12:34
Судя по ответу, у Вас есть опыт многопоточного программирования на WIN API :)
Нет, нету. С чего вы взяли? )


Название: Re: Как это происходит?
Отправлено: SASA от Январь 24, 2011, 12:46
Нет, нету. С чего вы взяли? )
Просто при создании потока на WIN API надо передать указатель на структуру. Насколько я помню, передаёшь указатель на void*, а потом приводишь её к нужной структуре.

На КуТэ поток ассоциирован с классом. Поток (функция run) может работать с данными этого класса. Прелесть в в том, что весь гемор с thread-safe можно реализовать в классе потока.


Название: Re: Как это происходит?
Отправлено: UVV от Январь 24, 2011, 12:49
Просто при создании потока на WIN API надо передать указатель на структуру. Насколько я помню, передаёшь указатель на void*, а потом приводишь её к нужной структуре.

На С та же техника ;)


Название: Re: Как это происходит?
Отправлено: Igors от Январь 24, 2011, 14:19
На КуТэ поток ассоциирован с классом. Поток (функция run) может работать с данными этого класса. Прелесть в в том, что весь гемор с thread-safe можно реализовать в классе потока.
Увы - далеко не весь


Название: Re: Как это происходит?
Отправлено: SASA от Январь 24, 2011, 15:00
Увы - далеко не весь
Я про доступ к данным (контекст нити), если ограничить этот доступ только методами класса.
Но при желании можно такое наворотить ... :D