С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119

Одновременный вызов функции из нескольких потоков

23.03.2021, 08:16. Показов 1592. Ответов 9

Студворк — интернет-сервис помощи студентам
Доброго времени. Как правильно вызвать одну и ту же функцию из разных потоков, чтобы они работали параллельно? Функция вызывается с разными аргументами.
Проблема в том, что если 1 поток "захватывает" функцию, то остальные начинают работать с ней некорректно. Важна одновременная работа всех потоков в целях экономия времени.
Заранее благодарю.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.03.2021, 08:16
Ответы с готовыми решениями:

СИ: одновременный вызов функции. библиотека.
Трудно задать вопрос, когда не очень понятно, что нужно получить в ответ. Попробую так: Пусть есть некий my_lib.so/dll содержащий...

Возможен ли одновременный доступ к одному ресурсу из нескольких потоков?
Возможен ли одновременный доступ к одному ресурсу из нескольких потоков? Допустим, есть целочисленный неотсортированный массив на 10 000...

Как обезопасить одновременный вызов функции?
Добрый день! а как бы мне обезопасить вызов функции из разных веток? Вот у меня есть пару thread и мне хочется чтобы в какой-то момент...

9
518 / 410 / 188
Регистрация: 08.04.2013
Сообщений: 1,750
23.03.2021, 08:58
скоро телепаты появятся, скажут, для остальных надо код выложить
0
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
23.03.2021, 09:56  [ТС]
Интересен общий случай, поэтому пример не был указан


C++
1
CComPort ComPort1, ComPort2, ComPort3;
Вызов потоков(в потоке)
C++
1
2
3
4
5
6
7
8
9
    
        1Load = AfxBeginThread(Load1Ch, DLG, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
        1Load->ResumeThread( );
    
        2Load = AfxBeginThread(Load2Ch, DLG, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
        2Load->ResumeThread( );
 
        3Load  = AfxBeginThread(Load3Ch, DLG, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
        3Load ->ResumeThread( );


Вызов функции в потоках соответственно
C++
1
2
3
4
    
                LoadTest(&ComPort1, "C:\\Users\\111.mot")  //Load1Ch
                LoadTest(&ComPort2, "C:\\Users\\111.mot")  //Load2Ch
                LoadTest(&ComPort3, "C:\\Users\\222.mot")  //Load3Ch
LoadTest возвращает ошибку на рандомном потоке
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.03.2021, 14:35
Цитата Сообщение от noz0o Посмотреть сообщение
Как правильно вызвать одну и ту же функцию из разных потоков, чтобы они работали параллельно?
Функция должна быть реинтерабельна.
p.s. Каков вопрос - таков ответ.
0
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
23.03.2021, 15:16  [ТС]
Сама функция

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
BOOL LoadTest(CComPort *ComPort, CString FileName)
{
 
    DWORD len = 0;
    CString wCommand, rCommand;
    CString msg;
    
    GetRS232Buf(ComPort, &msg);
 
    wCommand.Format("L");
    // выдать команду
    if (!ComPort->WriteBlock((LPBYTE)wCommand.GetBuffer(wCommand.GetLength()), wCommand.GetLength()))
        //if (!ComPort.PutByte(0x31))
    {
        return FALSE;
    }
    Sleep(100);
    // получить ответ
    len = GetCommand(ComPort, 'L', &rCommand);
    if (len == 0) return FALSE;
 
    if (LoadHexFile(ComPort, FileName)) return FALSE;
 
    GetRS232Buf(ComPort, &msg);
 
    wCommand.Format("R");
    // выдать команду
    if (!ComPort->WriteBlock((LPBYTE)wCommand.GetBuffer(wCommand.GetLength()), wCommand.GetLength()))
    {
        return FALSE;
    }
    Sleep(10);
    // получить ответ
    len = GetCommand(ComPort, 'R', &rCommand);
    if (len == 0) return FALSE;
 
    return TRUE;
 
}
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.03.2021, 15:26
noz0o, Вы понимаете, что для начала должны синхронизировать доступ к переменным len, wCommand, rCommand и т.д.? Здесь либо TLS, либо мьютексы. Все зависит от Вашей задачи. Еще раз порекомендую Вам почитать Побегайло.
0
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
23.03.2021, 15:42  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Вы понимаете, что для начала должны синхронизировать доступ к переменным len, wCommand, rCommand и т.д.? Здесь либо TLS, либо мьютексы. Все зависит от Вашей задачи. Еще раз порекомендую Вам почитать Побегайло.
Спасибо, обязательно прочту эту книгу

Мьютексы привели к последовательной загрузке файлов. Одновременно не загружаются

Добавлено через 12 минут
Разве потоки не создают копии переменных?
0
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2223 / 1425 / 420
Регистрация: 16.05.2013
Сообщений: 3,642
Записей в блоге: 6
23.03.2021, 15:56
Цитата Сообщение от noz0o Посмотреть сообщение
Мьютексы привели к последовательной загрузке файлов. Одновременно не загружаются
Вам необходимо понять какие данные будут разделяются потоками, а какие выделяться для каждого потока отдельно. Для синхронизации доступа к первой категории данных используйте мьютексы или семафоры, а для второй TLS.
Цитата Сообщение от noz0o Посмотреть сообщение
Разве потоки не создают копии переменных?
Почитайте про TLS и все вопросы отпадут сами собой
1
12 / 7 / 5
Регистрация: 27.02.2015
Сообщений: 119
24.03.2021, 15:51  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
Почитайте про TLS и все вопросы отпадут сами собой
Проблема решена, спасибо за "удочку"
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.03.2021, 16:09
Цитата Сообщение от Ilot Посмотреть сообщение
Вы понимаете, что для начала должны синхронизировать доступ к переменным len, wCommand, rCommand и т.д.?
Зачем? Они ж на стеке создаются, у каждого потока свой стек, ничего синхронизировать не надо.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.03.2021, 16:09
Помогаю со студенческими работами здесь

Вызов одной DLL из нескольких потоков
Привет всем. Не спрашивайте зачем При создании одного потока - все работает прекрасно и без ошибок. Если потоков 2 и больше - либо...

Вызов функции из разных потоков портит результаты
Всегда считал, что с потоками пользоваться умею, семафоры и делегаты использую постоянно. Но вот возникла проблема. При вызове одной...

Вызов из разных потоков функции чтения из файла, dll
Доброго времени суток. Помогите пожалуйста написать программу, вот задание: Вызов из разных потоков функции чтения из файла. Функция...

одновременный ввод/вывод с двух потоков
Создаю новый поток с помощью CreateThread(). Некая функция должна выводить какието строки на экран printf`ом или чем нибуть подобным,...

Одновременный вывод двух потоков в консоль
есть поток, который выводит числа по возрастанию. При нажатии клавиши появляется поток, выводящий числа по убыванию. То есть одновременно...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru