powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой инструмент многопоточности используете?
69 сообщений из 69, показаны все 3 страниц
Какой инструмент многопоточности используете?
    #39395894
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы. К тому же на него бочку катят из-за сложности отладки и большого количества потенциальных ошибок (ненадежности).

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

Intel Trading Blocks- нет литературы на русском, да и код превращается в адовы кирпичи.

Что посоветуете?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39395900
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_beginthreadex() рекомендую.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39395910
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЧто посоветуете?
Начать с чего попроще перед тем, как лезть в многопоточку.

Учебники там разные...
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39395925
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, multutheading это не опция С++ а свойство ОС (Linux, Windows)
и выбирать надо сначала то под что будешь кодить в будущем.

Тоесть это не вопрос вкуса а скорее обстоятельство или начальные
условия.

P.S. Посмотри Boost.Thread. Возможно с некоторой натяжкой сойдет
за то что тебе нужно.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39395964
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.
К тому же на него бочку катят из-за сложности отладки и большого количества потенциальных ошибок (ненадежности).
Это касается любого ЯП. Это обратная сторона многопоточности.

AlekseySQLЧто посоветуете?
Стандартные средства С++ std::async std::thread и все что связано с синхронизацией

Можешь свою обертку написать. Делаешь менеджер потоков, класс "задача" и дальше ты генеришь задачи, а менеджер рассовывает задачи по потокам. Можешь почитать например как в C# это устроено, класс Task<T>.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396084
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonAlekseySQL, multutheading это не опция С++ а свойство ОС (Linux, Windows)
и выбирать надо сначала то под что будешь кодить в будущем.

Тоесть это не вопрос вкуса а скорее обстоятельство или начальные
условия.

P.S. Посмотри Boost.Thread. Возможно с некоторой натяжкой сойдет
за то что тебе нужно.

Вообще- то уже давно созданы кроссплатформенные инструменты. Например, тот же Boost.Thread

И среди этих кроссплатформенных средств я как раз и выбираю.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396088
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TAlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.
К тому же на него бочку катят из-за сложности отладки и большого количества потенциальных ошибок (ненадежности).
Это касается любого ЯП. Это обратная сторона многопоточности.

AlekseySQLЧто посоветуете?
Стандартные средства С++ std::async std::thread и все что связано с синхронизацией

Можешь свою обертку написать. Делаешь менеджер потоков, класс "задача" и дальше ты генеришь задачи, а менеджер рассовывает задачи по потокам. Можешь почитать например как в C# это устроено, класс Task<T>.

Второе утверждение противоречит первому :) В С# оказывается не все так плохо: есть уже более высокий уровень абстракции в виде задач. Разумеется под C# писать не буду, и обдумываю написать свой менеджер задач.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396116
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВторое утверждение противоречит первому
Не противоречит, просто ты еще не пробовал асинхронные алгоритмы отлаживать :)
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396125
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.
Что посоветуете?

Я как раз именно библиотеку многопоточности C++ и посоветую.
std::thread и так далее, бывшая boost thread.

Она просто великолепна.

Я уверен, что ты не ее имел в виду в первой строке.

Open MP конечно хорошо, но это для тупых математикав, которым лень программировать.

Ну и что из заставит взяться за C++ - не понятно, у них есть великолепный Fortran, который очень хорошо всё это делает.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396132
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAlekseySQL, multutheading это не опция С++ а свойство ОС (Linux, Windows)
и выбирать надо сначала то под что будешь кодить в будущем.



уже нет, уже у нас есть встроенная ванильная многопоточность. Переносимая, стандартная.
С С++11.


maytonP.S. Посмотри Boost.Thread. Возможно с некоторой натяжкой сойдет
за то что тебе нужно.

не нужен уже Boost.Thread, он уже вошел в стандарт.
конечно, это если у вас есть с++ компилятор.
VC уже поддерживает.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396142
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,
Про Open MP...

Это очень классная вещь, но она для очень тупых случаев.

Представьте, что вам нужно просчитать
среднюю зарплату по всему населению Земли...
это тупо много, поэтому будет тупо долго, но если разбить на N кусков и отдать каждый своему потоку, а потом еще раз усреднить, то будет тупо в N раз (почти) быстрее.
Вот такие тупые задачи решает Open MP.
но зато она делает это автоматически, что очень приятно.

часто вы такие задачи решали?
я лично - ни разу за всю жизнь и карьеру.
так что для программирования на C++ оно практически не нужно.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396178
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivЯ как раз именно библиотеку многопоточности C++ и посоветую.
std::thread и так далее, бывшая boost thread.

Она просто великолепна.

Сейчас изучаю книжку "Параллельное программирование на С++ в действии". Как изучу отпишусь с вопросами :)

MasterZivMasterZiv,
Про Open MP...

С умным человеком и поговорить приятно :)
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396210
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZivЯ как раз именно библиотеку многопоточности C++ и посоветую.
std::thread и так далее, бывшая boost thread.

Она просто великолепна.

Сейчас изучаю книжку "Параллельное программирование на С++ в действии". Как изучу отпишусь с вопросами :)



Во, это -- самая правильная книжка. Мало того, что хорошо написана, так ещё и написана именно автором этой библиотеки (подсистемы поддержки многопоточности в стандартной библиотеке С+) - Anthony Williams.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396211
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivуже нет, уже у нас есть встроенная ванильная многопоточность. Переносимая, стандартная. С
С++11.

И при этом она совершенно отстойна в том плане, что заставляет делать прыжки в ширину для
в общем-то тривиальных (в нативном API) задач. Например, не даёт подождать завершения
одного любого потока из пула.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396256
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAlekseySQLпропущено...


Сейчас изучаю книжку "Параллельное программирование на С++ в действии". Как изучу отпишусь с вопросами :)



Во, это -- самая правильная книжка. Мало того, что хорошо написана, так ещё и написана именно автором этой библиотеки (подсистемы поддержки многопоточности в стандартной библиотеке С+) - Anthony Williams.
Читал в оригинале на английском. Скажу лишь, что она совсем не для новичков. Мало того, тема атомарных операций и, в частности, memory_order'а не в совсем понятной манере, что приходилось "напрягаться" сверх нормы, чтобы осилить.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396523
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivуже нет, уже у нас есть встроенная ванильная многопоточность. Переносимая, стандартная. С
С++11.

И при этом она совершенно отстойна в том плане, что заставляет делать прыжки в ширину для
в общем-то тривиальных (в нативном API) задач. Например, не даёт подождать завершения
одного любого потока из пула.


Чего? JOIN и всё...
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396532
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivAnthony Williams.
Скажу лишь, что она совсем не для новичков.


Да ну, всё разжёвано и в рот положено, начиная с азов.

NekZМало того, тема атомарных операций и, в частности, memory_order'а не в совсем понятной манере, что приходилось "напрягаться" сверх нормы, чтобы осилить.

Ну, это -- вообще далеко не самая простая и очевидная вещь, и на самом деле не самая нужная для конечного разработчика.
В принципе, её не обязательно понимать глубоко, или даже вообще понимать.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396581
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЧего? JOIN и всё...
Ну да, ну да. Вот только join это метод std::thread, который ждёт завершения этого
конкретного потока. А теперь внимательно перечитывай "любого одного потока" до просветления.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396690
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivЧего? JOIN и всё...
Ну да, ну да. Вот только join это метод std::thread, который ждёт завершения этого
конкретного потока. А теперь внимательно перечитывай "любого одного потока" до просветления.


В смысле -- ХОТЯ БЫ одного ?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396693
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivВ смысле -- ХОТЯ БЫ одного ?
Дословно. У тебя есть 20 потоков и ты ждёшь завершения любого из них. Аварийного или
штатного - без разницы. Как такое обеспечить в случае std::thread?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396708
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMasterZivВ смысле -- ХОТЯ БЫ одного ?
Дословно. У тебя есть 20 потоков и ты ждёшь завершения любого из них. Аварийного или
штатного - без разницы. Как такое обеспечить в случае std::thread?

Хоть std::thread появился и на том спасибо. Уже не надо кучу #ifdef WIN32 ...
По хорошему еще надо std::thread_pool и там это реализовать. Много еще чего надо, но стандартописатели не торопятся.
А этот вопрос вроде как можно через std::thread::native_handle порешать.
Без std::thread прыгать гораздо шире надо было.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396743
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovMasterZivВ смысле -- ХОТЯ БЫ одного ?
Дословно. У тебя есть 20 потоков и ты ждёшь завершения любого из них. Аварийного или
штатного - без разницы. Как такое обеспечить в случае std::thread?


В стандарте есть "продвинутые" потоки future/async.
Например, есть 4 потока и ждешь пока освободиться любой из них успешного или аварийного, и так 20 раз.

http://coliru.stacked-crooked.com/a/d1d43d9111f669be

Код: plaintext
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.
#include <iostream>
#include <future>
#include <thread>
#include <vector>
#include <chrono>
#include <stdexcept>
 
void thread_func() {
    std::cout << "new thread \n";  
    
    if (rand()%2 == 0) throw std::runtime_error("my exception");
}
 
int main()
{
    std::vector<std::future<void>> thread_pool(4);
    
    // occupy all cores
    for(auto &i : thread_pool) i = std::async(std::launch::async, thread_func);
    
    // start a new task in freed thread (for example 20 times)
    for(int k = 0; k < 20;) {
        for(auto &i : thread_pool)
            if(i.wait_for(std::chrono::seconds(0)) == std::future_status::ready) 
            {
                try { i.get(); } catch(...) { std::cout << "exception was in thread \n"; }
                i = std::async(std::launch::async, thread_func);
                ++k;
            }
        std::this_thread::yield();
    }
    
    return 0;
}
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396770
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.

А все же, что ты имел в виду конкретно?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396777
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинНапример, есть 4 потока и ждешь пока освободиться любой из них успешного или аварийного, и
так 20 раз.

Опрос состояния всех потоков в цикле. Прэлееестно. Это даже не прыжки в ширину, это бег на
месте с препятствиями.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396805
locked
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovВася УткинНапример, есть 4 потока и ждешь пока освободиться любой из них успешного или аварийного, и
так 20 раз.

Опрос состояния всех потоков в цикле. Прэлееестно. Это даже не прыжки в ширину, это бег на
месте с препятствиями.

К тому же никто не обещал что там есть какие-то потоки. Больше похоже на node.js стиль
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396816
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.

А все же, что ты имел в виду конкретно?

Стандартную библиотеку С++ :) Не хватает оберток над потоками, чтобы из-за более высокой абстракции количество кода уменьшилось.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396821
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В тему!
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39396855
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivmaytonP.S. Посмотри Boost.Thread. Возможно с некоторой натяжкой сойдет
за то что тебе нужно.

не нужен уже Boost.Thread, он уже вошел в стандарт.
конечно, это если у вас есть с++ компилятор.
VC уже поддерживает.
Ну... классно.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397209
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНу, это -- вообще далеко не самая простая и очевидная вещь, и на самом деле не самая нужная для конечного разработчика.
В принципе, её не обязательно понимать глубоко, или даже вообще понимать.
Не сказал бы так... Если от тебя требуется выжать максимум производительности, как от low latency programmer'а, то часто приходится прибегать к "программированию без блокировок", напрасно не тратя время на бессмысленные переключения контекста (что является убийцей высокой производительности). Именно тогда-то атомики и решают. Учитывая, что они включены в стандартную библиотеку, и не требуется больше никаких зависимостей.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397365
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZMasterZivНу, это -- вообще далеко не самая простая и очевидная вещь, и на самом деле не самая нужная для конечного разработчика.
В принципе, её не обязательно понимать глубоко, или даже вообще понимать.
Не сказал бы так... Если от тебя требуется выжать максимум производительности, как от low latency programmer'а, то часто приходится прибегать к "программированию без блокировок", напрасно не тратя время на бессмысленные переключения контекста (что является убийцей высокой производительности). Именно тогда-то атомики и решают. Учитывая, что они включены в стандартную библиотеку, и не требуется больше никаких зависимостей.

Ерунда. 90% производительности не в этом закладывается.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397377
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovВася УткинНапример, есть 4 потока и ждешь пока освободиться любой из них успешного или аварийного, и
так 20 раз.

Опрос состояния всех потоков в цикле. Прэлееестно. Это даже не прыжки в ширину, это бег на
месте с препятствиями.

Извольте показать свой вариант, как бы сделали это вы, или как бы в идеале это должно было быть реализовано внутри C++ или OS
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397393
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю речь о WaitForMultipleObjects() если речь про виндовс. Подсунул ей массив хэндлов потоков и жди.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397433
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЯ так понимаю речь о WaitForMultipleObjects() если речь про виндовс. Подсунул ей массив хэндлов потоков и жди.
Я так понимаю Dimitry Sibiryakov знает какую-то намного более простую и быструю реализацию подобного WaitForMultipleObjects(), но написать её не может :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
size_t WaitForMultipleObjects(std::vector<std::future<void>> &thread_pool)
{
	while (true) {
		for (size_t i = 0; i < thread_pool.size(); ++i)
			if (thread_pool[i].wait_for(std::chrono::seconds(0)) == std::future_status::ready) {
				return i;
			}
		std::this_thread::sleep_for(std::chrono::milliseconds(1));
	}
	return std::numeric_limits<size_t>::max();
}
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397442
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ так понимаю речь о WaitForMultipleObjects() если речь про виндовс. Подсунул ей массив
хэндлов потоков и жди.

Да, именно о нём. И я более чем уверен, что внутри его реализации нет цикла, а есть
занесение текущего потока в список ожидания для всех alertable objеcts из массива и
спокойный сон до вызова resume при изменении состояния любого из этих объектов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397547
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDima TЯ так понимаю речь о WaitForMultipleObjects() если речь про виндовс. Подсунул ей массив
хэндлов потоков и жди.

Да, именно о нём. И я более чем уверен, что внутри его реализации нет цикла, а есть
занесение текущего потока в список ожидания для всех alertable objеcts из массива и
спокойный сон до вызова resume при изменении состояния любого из этих объектов.

Так и есть, т.к. это средства ОС. Виндовс просто перестает выделять потоку кванты времени пока хотя бы один из хэндлов не перейдет в сигнальное состояние, т.е. завершится поток. КПД 100%, пробуждение мгновенное.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397548
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин
Код: plaintext
1.
		std::this_thread::sleep_for(std::chrono::milliseconds(1));


А потом ищем почему прога тупит.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397587
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВася Уткин
Код: plaintext
1.
		std::this_thread::sleep_for(std::chrono::milliseconds(1));


А потом ищем почему прога тупит.
Так так так, интересно, почему?
Подскажи, а то тут прога тупит с ожиданием 1мс между проверкой статусов потоков на ОС с квантом времени >=1мс. Какие книжки почитать?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397591
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинDima Tпропущено...

А потом ищем почему прога тупит.
Так так так, интересно, почему?
Подскажи, а то тут прога тупит с ожиданием 1мс между проверкой статусов потоков на ОС с квантом времени >=1мс. Какие книжки почитать?
Потому что квант 10-20 мс, от того что ты 1 мс попросил это не факт что ОС ровно через 1мс тебе управление вернет. Если не загружена - вернет.

Да и потоков за 1 мс может пачка отработать.
Запусти
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
#include <stdio.h>
#include <time.h>
#include <thread>

int x = 0;

void f() {
	x++;
}

#define TEST 10000

int main()
{
	clock_t t = clock();
	for(int i = 0; i < TEST; i++) {
		std::thread th(f);
		th.join();
	}
	printf("%f thread per msec\n%d\n", (double)TEST / ((double)(clock() - t) / CLOCKS_PER_SEC) / 1000, x);
	return 0;
}

...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397597
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВася Уткинпропущено...

Так так так, интересно, почему?
Подскажи, а то тут прога тупит с ожиданием 1мс между проверкой статусов потоков на ОС с квантом времени >=1мс. Какие книжки почитать?
Потому что квант 10-20 мс, от того что ты 1 мс попросил это не факт что ОС ровно через 1мс тебе управление вернет. Если не загружена - вернет.

Да и потоков за 1 мс может пачка отработать.
Спасибо, а поток ожидающий (уснувший) на стандартном виндовом WaitForMultipleObjects() гарантированно не больше чем за 1мс проснется после того как один из ожидаемых потоков завершится?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397598
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинСпасибо, а поток ожидающий (уснувший) на стандартном виндовом WaitForMultipleObjects() гарантированно не больше чем за 1мс проснется после того как один из ожидаемых потоков завершится?
гарантий нет
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397603
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинDima Tпропущено...

Потому что квант 10-20 мс, от того что ты 1 мс попросил это не факт что ОС ровно через 1мс тебе управление вернет. Если не загружена - вернет.

Да и потоков за 1 мс может пачка отработать.
Спасибо, а поток ожидающий (уснувший) на стандартном виндовом WaitForMultipleObjects() гарантированно не больше чем за 1мс проснется после того как один из ожидаемых потоков завершится?
Гарантий нет, виндовс не реалтайм ОС, но скорее всего время будет единицы нано секунд. Принцип простой: поток завершился, ОС смотрит кто ожидает его завершения (как правило это один поток) и дает квант времени ожидающему. Примитивно описал, как оно реально происходит MS не разглашает.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397607
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TВася Уткинпропущено...

Спасибо, а поток ожидающий (уснувший) на стандартном виндовом WaitForMultipleObjects() гарантированно не больше чем за 1мс проснется после того как один из ожидаемых потоков завершится?
Гарантий нет, виндовс не реалтайм ОС, но скорее всего время будет единицы нано секунд. Принцип простой: поток завершился, ОС смотрит кто ожидает его завершения (как правило это один поток) и дает квант времени ожидающему. Примитивно описал, как оно реально происходит MS не разглашает.
А если все ядра заняты?
Т.е. переключение контекста занимает единицы нано-секунд?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397609
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Математика простая: 3 ГГц = 3 млрд. операций, т.е. за 1 мс будет 3 млн. операций. Вот и думай что можно сделать за 3 млн. операций.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397617
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TМатематика простая: 3 ГГц = 3 млрд. операций, т.е. за 1 мс будет 3 млн. операций. Вот и думай что можно сделать за 3 млн. операций.
Т.е. т.к. за 1мс процессор совершит 3 млн операций, то если все ядра заняты, то произойдет переключение контекста на поток ожидающий WaitForMultipleObjects() за единицы наносекунд?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397779
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинDima TМатематика простая: 3 ГГц = 3 млрд. операций, т.е. за 1 мс будет 3 млн. операций. Вот и думай что можно сделать за 3 млн. операций.
Т.е. т.к. за 1мс процессор совершит 3 млн операций, то если все ядра заняты, то произойдет переключение контекста на поток ожидающий WaitForMultipleObjects() за единицы наносекунд?
Во первых ядра не все заняты, как минимум одно освободилось, т.к. ждали завершение потока. Т.е. один завершился, ожидающий его запустился. А может не запустился, а только встал в очередь на выполнение. ХЗ как оно в реале происходит когда одновременно работает потоков больше чем ядер, МС это не описывает.

Переключение контекста тоже не такое уж и сложное дело, там восстановление состояния регистров проца происходит. Сколько точно оно занимает - не знаю, 3 операций, 30 или 300. Возвращаясь к цифрам 1 нс это 3 операции проца. Пусть я ошибаюсь и это сотни наносекунд, все равно это в 1000+ раз меньше чем 1 мс.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397965
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Придумал как грубо замерить переключения контекста
Код: plaintext
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.
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <thread>
#include <mutex>

int x = 0;
std::mutex m;

void f() {
	while(true) {
		m.lock();
		x++;
		m.unlock();
	}
}

#define TEST 10000

int main()
{
	m.lock();
	std::thread th1(f), th2(f);
	Sleep(100);
	clock_t t = clock();
	m.unlock();
	Sleep(1000);
	printf("%f nanosec\n%d\n", ((double)(clock() - t) / CLOCKS_PER_SEC) * 1000000000 / x, x);
	th1.detach();
	th2.detach();
	return 0;
}


У меня 27 наносекунд получилось. Правда в тесте еще мутекс переключается, поэтому само переключение контекста еще быстрее.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39397988
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не то померил, там без переключения один и тот же поток мьютекс захватывает многократно.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39398139
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TПотому что квант 10-20 мс, от того что ты 1 мс попросил это не факт что ОС ровно через 1мс тебе управление вернет. Если не загружена - вернет .
Dima TВо первых ядра не все заняты, как минимум одно освободилось , т.к. ждали завершение потока. Т.е. один завершился, ожидающий его запустился.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39398152
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из контекста слова не вырывай. Если частично цитируешь, то бери абзац целиком.
Dima TВо первых ядра не все заняты, как минимум одно освободилось, т.к. ждали завершение потока. Т.е. один завершился, ожидающий его запустился. А может не запустился, а только встал в очередь на выполнение. ХЗ как оно в реале происходит когда одновременно работает потоков больше чем ядер, МС это не описывает.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39398168
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TТак и есть, т.к. это средства ОС. Виндовс просто перестает выделять потоку кванты времени пока хотя бы один из хэндлов не перейдет в сигнальное состояние, т.е. завершится поток. КПД 100%, пробуждение мгновенное.
Dima TВо первых ядра не все заняты, как минимум одно освободилось, т.к. ждали завершение потока. Т.е. один завершился, ожидающий его запустился. А может не запустился, а только встал в очередь на выполнение. ХЗ как оно в реале происходит когда одновременно работает потоков больше чем ядер, МС это не описывает.
Т.е. обычный виндовый WaitForMultipleObjects() вообще не гарантирует, что поток его ожидающий продолжит выполнение через 1нс или 1мс или даже 1 секунду после завершения ожидаемого потока?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39398208
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася УткинТ.е. обычный виндовый WaitForMultipleObjects() вообще не гарантирует, что поток его ожидающий продолжит выполнение через 1нс или 1мс или даже 1 секунду после завершения ожидаемого потока?
Виндовс не гарантирует конкретное время, т.к. это не ОС реального времени, а ОС с вытесняющей многозадачностью.
Если будут работать потоки с более высоким приоритетом, то твои будут ждать пока они закончат.
Если будет работать много потоков с одинаковым приоритетом, то твой станет в очередь.
Вобщем виндовс гарантирует что будет стараться дать проц твоему потоку как можно быстрее. В лучшем случае это наносекунды, в худшем как получится.

Почитай Рихтера
Глава 7. Планирование потоков
Глава 9. Синхронизация потоков
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Какой инструмент многопоточности используете?
    #39754306
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
std::async После работы async-ов, например, этой , обнаруживаю кучу потоков в процессе, хотя все они отработали. Это пул? Как почистить? Надо ли это делать?
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754330
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
]Мне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы. К тому же на него бочку катят из-за сложности отладки и большого количества потенциальных ошибок (ненадежности).

Параллельное программирование в принципе сложное,
И тут ничего не сделаешь, надо просто учиться.

OpenMP и другие подобные вещи хороши тем, что работают
автоматом, плохо, что не всегда.
Лучшие вещи надо делать руками.

Так что у тебя собственно нет выбора, либо учись, либо не занимайся параллельным программированием.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754408
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть интервью с Дональдом Кнутом от 2008 года http://citforum.ru/gazeta/76/

Маэстро довольно резко отзывается о технологии. Для него Pipeline полезнее чем многопоточка.
Жаль что тема не была развита до асинков и корутинов.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754421
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivТак что у тебя собственно нет выбораДа, в общем-то, у меня проблем и не было о_о
Я просто хотел узнать про почему потоки остаются в процессе? Судя по докам, потоки могут браться из пула потоков, а раз могу браться, значит туда могут и складываться
, вот хотел поподробнее узнать про пул.

Так-то я обычно, да, руками создаю треди (beginthreadex) и разруливаю мьютексами. Но тут понадобилось рабочий код, в котором есть некоторый контекст, разрезать на две параллельные части, одна из которых - запрос в базу. Всё хорошо, но контекст вокруг надо куда-то сложить, а потом достать. Т.е. надо организовывать вариативное хранилище данных с диспетчером. А усложнять код не хотелось. Пошёл почитать, что нового есть в плюсах по многопоточности. Нашёл async, который позволяет скинуть всю функцию вместе с сигнатурой в поток. Отлично!

MasterZivМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы.Это немного странно.
maytonДля него Pipeline полезнее чем многопоточка.Иногда без многопоточки гораздо хуже. Если, к примеру, есть реалтайм, в котором много вычислений и много рисований. Можно параллельно что-то одно считать, а другое рисовать. При этом легко можно управлять скоростью пересчёта и рендеринга отдельно. Тогда как в одном потоке, мало того, что медленнее, так ещё и сложнее это сделать.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754427
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMb,

это испорченный телефон.
MasterZiv запамятовал что теме полтора года и что он в ней уже участвовал и снова ответил топик стартеру.
Но сделал это с кривой разметкой цаитирования.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754542
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbИногда без многопоточки гораздо хуже. Если, к примеру, есть реалтайм, в котором много вычислений и много рисований. Можно параллельно что-то одно считать, а другое рисовать. При этом легко можно управлять скоростью пересчёта и рендеринга отдельно. Тогда как в одном потоке, мало того, что медленнее, так ещё и сложнее это сделать.
Я в этом услышал другое.

Большинство современных приложений. Особенно декстоп. Это event-driven. Яркий пример - основной цикл WNDPROC.
Обработали событие - и освободились. Фоновые задачи (догрузка картинок из интернетов) тоже имеют место.
Но они все - суть асинхронные вызовы.

Возьмем сеть идут сетевые пакеты. Строго последовательно. Приложение - сервис которое их обрабатывае
тоже может работать последовательно. Особенно для класса OLTP-систем.

За редким случаем когда идут расчеты в физике или обработка графики (рендеринг) или распознавание. Но и эти
задачи по большей части проходят со слабой concurrency. Фактически независимые задания - которые мержат
результат в какой-то один получатель.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754551
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯркий пример - основной цикл WNDPROC.

И ты хорошо знаешь что будет если в этом потоке начать делать что-то кроме цикла выборки
сообщений, а в обработку события запихать что-то тяжелее установки флагом и рассылки тех
самых event-ов.

maytonВозьмем сеть идут сетевые пакеты. Строго последовательно. Приложение - сервис
которое их обрабатывае тоже может работать последовательно.
Может, но при этом не нужно удивляться если UDP пакеты теряются, а скорость передачи
внезапно ниже, чем пропускная способность сети, поскольку необработанные пакеты
громоздятся в буферах, на них не отсылается ACK и передающая сторона начинает забивать
свои буфера, а потом и блокировать отправку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754552
semen.s.semen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLМне не нравится C++ Multi-threading из- за большого количества кода, за которым теряется суть программы. К тому же на него бочку катят из-за сложности отладки и большого количества потенциальных ошибок (ненадежности).

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

Intel Trading Blocks- нет литературы на русском, да и код превращается в адовы кирпичи.

Что посоветуете?


https://www.threadingbuildingblocks.org/
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754554
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovmaytonЯркий пример - основной цикл WNDPROC.

И ты хорошо знаешь что будет если в этом потоке начать делать что-то кроме цикла выборки
сообщений, а в обработку события запихать что-то тяжелее установки флагом и рассылки тех
самых event-ов.
Я беру за основу 99% юзкейсов UI приложения. В них обычно простая логика. Конечный автомат
с быстрым срабатыванием баръеров.

Джобы и фоновые задания - это OK/ Я согласен. Обсуждается отдельно и тестируется.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754560
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovМожет, но при этом не нужно удивляться если UDP пакеты теряются, а скорость передачи
внезапно ниже, чем пропускная способность сети, поскольку необработанные пакеты
громоздятся в буферах, на них не отсылается ACK и передающая сторона начинает забивать
свои буфера, а потом и блокировать отправку.

Это неудачный пример. UDP изначально - протокол-камикадзе.
Протокол взаимодейтвия с DNS предполагает очень быструю реакцию (это +1) и нечуствительность
к одиночным потерям. Или системы вещания медийного трафика где пропажа кадра видео
не оказывает влияния на результат в целом.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754564
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

SSIS прекрасно умеет многопоточить несколько десятков потоков.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754570
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЭто неудачный пример. UDP изначально - протокол-камикадзе.
Плюсы у него тоже есть. Гугл уже 5 лет пилит свой протокол QUIC (Quick UDP Internet Connections)
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754775
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯркий пример - основной цикл WNDPROC.У WNDPROC очередь с приоритетами. И, наверно, было бы неплохо, если можно было свои вещи встраивать в эту очередь. О чём я: у меня запрос в базу через ADO, база далеко, основной поток встаёт в ожидании весь. В идеале, я отправил запрос, одно событие, получил ответ - второе. Ну, т.е. так и надо делать. Но самому. А WNDPROC это уже есть. Я вот тут пишу сейчас код быстро, так получилось. Хотел сделать индикацию ожидания запросов из базы, прогрессбар. Но основной поток занят, надо делать отдельный поток, который будет: 1. по таймеру обновлять прогресс, 2. выгребать и диспатчить WNDPROC, иначе прогресс будет не виден глазами... Но в результате вынес сами запросы в отдельные потоки, теперь можно наблюдать гонки заполнения продуктов в приложении по мере выполнения запросов, а индикация крутится по таймеру/событиям в основном потоке.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39754903
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbу меня запрос в базу через ADO, база далеко, основной поток встаёт в ожидании весь. В
идеале, я отправил запрос, одно событие, получил ответ - второе.

А найти и включить у ADO асинхронный режим - задача непосильная для среднего программиста,
ага.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39756938
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА найти и включить у ADO асинхронный режим - задача непосильная для среднего программиста,
ага.
Ага.
Ну, для начала, не хочется отдавать управление потоками ADO.
А во-вторых, я как-то не думал в эту сторону. Посмотрю, спасибо.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39757153
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CEMbНу, для начала, не хочется отдавать управление потоками ADO.

Ты не поверишь, но для асинхронности в ADO не (всегда) используются потоки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39757589
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТы не поверишья поверю, просто дело в контроле, хочется это место самому контролировать.
...
Рейтинг: 0 / 0
Какой инструмент многопоточности используете?
    #39757974
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, пора кончать эти извращения.
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой инструмент многопоточности используете?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]