powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой инструмент многопоточности используете?
25 сообщений из 69, страница 2 из 3
Какой инструмент многопоточности используете?
    #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
25 сообщений из 69, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Какой инструмент многопоточности используете?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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