Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
1

Многопоточность

26.10.2011, 13:01. Просмотров 1713. Ответов 9
Метки нет (Все метки)


Имеется приложение на Си в VS 2008.
Приложение может создать большое количество экземпляров клиента для разных серверов (named pipes) одновременно. Максимальное количество клиентов определяется константой, но текущее количество клиентов может быть любое (не больше константы). Планируется запускать для каждого клиента отдельный поток.
Выделю слово экземпляры, т.е. функция создания клиента и опроса приема сообщения у всех одна с разными аргументами.
Для запуска потока для одного клиента нужно создать функцию, например, void ThreadClient1(void* pParams) и запустить её через beginthread(...). А если потоков будет 100, не буду же я создавать 100 таких функций.
Подскажите возможности и идеи реализации. Не имею большого опыта с многопоточностью.
Спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2011, 13:01
Ответы с готовыми решениями:

Многопоточность
Здрасьте! Люди, на этом форуме нашел ценный ответ по реализации мультипотоковых программах....

Многопоточность
Мне нужно сделать класс, от которого можно наследовать ещё какой-нибудь класс с какой-то...

C++ Многопоточность
Как сделать так, чтобы эта программа заработала? А то она мне вот что пишет: g++ test.cpp -o...

THREAD.H (многопоточность)
нужно срочно разобраться в этой теме, но компилятор не находит THREAD.H #include <thread> ...

9
Эксперт С++
7175 / 3234 / 77
Регистрация: 17.06.2009
Сообщений: 14,165
26.10.2011, 14:02 2
Запускай одну и ту же функцию с разными параметрами
Код у них один и тот же - то есть функция одна и та же

Для учета всех запущенных потоков можно завести массив на 100 элементов
1
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
26.10.2011, 14:07  [ТС] 3
Цитата Сообщение от odip Посмотреть сообщение
Запускай одну и ту же функцию с разными параметрами
Код у них один и тот же - то есть функция одна и та же

Для учета всех запущенных потоков можно завести массив на 100 элементов
Интересно, я думал так нельзя. Спасибо, попробую
0
Эксперт С++
7175 / 3234 / 77
Регистрация: 17.06.2009
Сообщений: 14,165
26.10.2011, 14:16 4
Интересно, я думал так нельзя
Тогда читай про многопоточность - похоже у тебя не очень полное понимание как оно устроено и работает
Фактически в обычной программе у тебя есть одна точка выполнения программы
В многопоточной программе у тебя есть много точек выполнения
Так что вполне может быть запущено 10 одинаковых функций - в каждой функции своя точка выполнения кода (разная)
Но в связи с этим в многопоточной программы вылезают другие проблемы
- синхронизация разных потоков
- необходимость блокировки переменных когда к переменной имеет доступ несколько потоков одновременно

Добавлено через 1 минуту
Блокировка общих переменных, массивов, структур - вообщем всего чего угодно
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
27.10.2011, 13:49  [ТС] 5
Добавлено через 23 часа 8 минут
Так, все-таки проблемы появились.

C++
1
2
3
4
5
6
7
8
hMutex = CreateMutex( NULL,FALSE,NULL );
 
_beginthread( Thread,0,( HANDLE* )hnd );
 
// Ждем освобождения мьютекса
dwWaitResult = WaitForSingleObject( hMutex, 5000L); // 5 секунд на таймаут
 
return hnd;
Не понимаю, почему программа не ждет освобождения мьютекса и сразу идет к return hnd; ?


Хммм... нельзя в одном потоке создавать мьютекс и выполнять функцию WaitForSingleObject ?
0
Эксперт С++
7175 / 3234 / 77
Регистрация: 17.06.2009
Сообщений: 14,165
27.10.2011, 15:24 6
hMutex должен быть глобальный
Иначе сам создал - сам залочил - сам разлочил
Другие треады и не видят этот mutex ;-)

Using Mutex Objects
http://msdn.microsoft.com/en-u... 85%29.aspx
1
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 14:51  [ТС] 7
Цитата Сообщение от odip Посмотреть сообщение
hMutex должен быть глобальный
Иначе сам создал - сам залочил - сам разлочил
Другие треады и не видят этот mutex ;-)

Using Mutex Objects
http://msdn.microsoft.com/en-u... 85%29.aspx
хэндл глобальный. Немного не понимал как работает мьютекс, сейчас только доходит.
Спасибо за помощь. Но это еще не все вопросы

Добавлено через 22 часа 57 минут
Если у одной функции много разных точек доступа (потоков с разными параметрами), можно ли как-нить отследить закономерность обращения потоков к функции? Или случайным образом?
0
374 / 321 / 32
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
28.10.2011, 16:01 8
Цитата Сообщение от Mustik Посмотреть сообщение
Если у одной функции много разных точек доступа (потоков с разными параметрами), можно ли как-нить отследить закономерность обращения потоков к функции? Или случайным образом?
Насчет случайного ... вообще не понял о чем речь. Обращения можно отслеживать, например, из вызывающих функций. Можно из самой вызываемой функции. Interlocked Variable. Если нужен учет вызывающих функций, то, например, передаем параметром имя (или ID). Вообще и другие варианты существуют
0
58 / 58 / 6
Регистрация: 10.07.2011
Сообщений: 229
28.10.2011, 19:27  [ТС] 9
Цитата Сообщение от bigredcat Посмотреть сообщение
Насчет случайного ... вообще не понял о чем речь. Обращения можно отслеживать, например, из вызывающих функций. Можно из самой вызываемой функции. Interlocked Variable. Если нужен учет вызывающих функций, то, например, передаем параметром имя (или ID). Вообще и другие варианты существуют
Про точки доступа пару сообщений выше, товарищ odip писал, поэтому я дословно выразился.
есть функция
C++
1
2
3
4
5
6
7
8
9
10
11
void Thread (void* pParams)
{
    State = WaitForSingleObject(...);
    .....
    while(1)
    {
    ...
        ReleaseMutex(....);
        Sleep(1);
    }
}
Эту функцию будет использовать, например, 20 потоков с разными ID, которые я буду передавать в параметрах.
Запустил я все 20 потоков. Ставлю брейкпоинт на ReleaseMutex и вижу, что при каждой остановке ID рандомно разный, ну т.е. не последовательно меняется. Вот, что я и спрашивал. Я хотел узнать, есть ли какая-нить закономерность в доступе потоков к функции... Получается, что нету.
А может они работают параллельно?
Или мне стоит прочитать где-нить хорошую статью про многопоточность?
0
110 / 111 / 18
Регистрация: 11.03.2011
Сообщений: 421
29.10.2011, 18:50 10
Или мне стоит прочитать где-нить хорошую статью про многопоточность?
и заодно почитать общие принципы работы операционной системы с процессами и потоками, распределением между ними ресурсов системы и процессорного времени.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.10.2011, 18:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Многопоточность в MFC
Доброе время суток. Возник ряд вопросов, касающихся реализации многопточности на MFC. Поток создаю...

Простое приложение для MFC, использующее многопоточность
Прошу помочь написатьпростое использование многопоточности в mfc visual c++, все перечитал,написать...

Многопоточность в Windows.Forms: вопрос реализации в общем
Всем добрый день. Только начинаю изучать с++, пользуюсь microsoft visual c++ 2010. возникла такая...

[Многопоточность] Как в функцию, которая будет выполняться в отдельном потоке, передать нужные аргументы?
Есть функция: UINT control1(LPVOID Param) { char msg;char pr="w"; while(true){...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.