powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоки. Разделяемые переменные.
31 сообщений из 31, показаны все 2 страниц
Потоки. Разделяемые переменные.
    #39924103
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется несколько потоков-писателей. Каждый из них изменяет свои переменные и тут все нормально. Писатели уже пишут.
Имеется несколько потоков-читателей. Каждый из них имеет доступ и может читать любые переменные.

Я уже почитал инет. Имхо, здесь ничего не нужно и все проблемы с совместным доступом к памяти решаются на уровне железа. Так ли это?
Вроде, есть угроза, что переменная будет где-то в кэше. Так в следующем цикле я ее правильно прочитаю, не вопрос, вроде? Или нет?
Типы данных, в основном, структуры и векторы.
2. Стоит ли в потоке считывать переменные один раз, создавать свои копии переменных, и работать уже с ними?

Еще ничего не делал, в смысле потоков-читателей, хочу выяснить заранее, чтобы не нарваться.)

"Есть многое на свете, друг Горацио, что и не сразу в голову придет."
М. Твен "Приключения Геккельбери Финна"
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924118
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отсутствие thorn read на интеловской архитектуре железом гарантируется только до ширины
шины данных, т.е. 32 бита на 32 битных платформах и 64 бита на 64-х. Всё.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924127
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924136
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
2. Стоит ли в потоке считывать переменные один раз, создавать свои копии переменных, и работать уже с ними?

Стоит на прикладном уровне кода для работы потока приготовить отдельные переменные.
Чтобы потом не блокировать и не синхронизировать.
Тогда минимальное переключение контекста и максимальная параллельность\скорость.
Если данные не разделить, тогда вопрос о нужности самого распараллеливания работ.
Ну, либо всё уже решено в СУБД. Там каждому потоку коннект и работай себе параллельно.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924137
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy.

В Java есть раздел - типо Потокобезопасные векторы. Классы другие, дописанные.
Там внутри методов стоит синхронизация и защита от потоков.
Но повторюсь, лучше разделить при входе в поток чем несколько потоков используют один вектор.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924139
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Вроде, можно использовать векторы, структуры и массивы с std::atomic? Их ведь можно memcpy.

Мдя (((

На самом деле тема эта очень сложная, граблей там очень много и искать их очень сложно, особенно если не понимаешь как оно работает. Советую почитать Рихтера , хотя бы то что касается многопоточности.

В простейшем случае используй мутексы . Это классика, камменты к коду из примера по ссылке
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
std::mutex g_pages_mutex;
 
void save_page(const std::string &url){
...
    std::lock_guard<std::mutex> guard(g_pages_mutex); // Установка блокировки, код ниже выполнит только один поток
... тут пишем читаем общие переменные
} // тут guard уничтожается и произойдет разблокировка


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

std::atomic использовать не советую пока не наступит понимание как это работает.

Еще можешь погуглить lock-free алгоритмы, это готовые решения для многопоточной работы. Этого товарища почитай
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924146
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924194
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Имеется несколько потоков-писателей. Каждый из них изменяет свои переменные и тут все нормально. Писатели уже пишут.
Имеется несколько потоков-читателей. Каждый из них имеет доступ и может читать любые переменные.

false sharing (когда core1 лезет по адресу A, а core2 лезет по адресу A+1, то скорее всего оба ядра попадут на одну cache-line (там же общий L2-cache у них).
Они будут конкурентно перезаписывать одну и туже cache line, в итоге оба останутся БЕЗ кэша).
можете тут послушать (с 6:30, там есть субтитры на англ.):
YouTube Video
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924195
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухОни будут конкурентно перезаписывать одну и туже cache line, в итоге оба останутся БЕЗ кэша).

От этого может просесть производительность, но сами данные останутся корректными.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924204
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух, есть решение и без мьютекса, типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
bool flag =false;
int DoIt()
{
if(flag) {return 1;};
flag = true;
//делаем что нибудь
flag = false;
return 0;
}

Но это не проходит там, где нужна приостановка потока и ожидание. Уже нужно бесконечный цикл городить. Лень.)
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924207
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
полудух, есть решение и без мьютекса, типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
bool flag =false;
int DoIt()
{
if(flag) {return 1;};
flag = true;
//делаем что нибудь
flag = false;
return 0;
}

Но это не проходит там, где нужна приостановка потока и ожидание. Уже нужно бесконечный цикл городить. Лень.)

ужос

Почитай хотя бы эту книжку 22075920 .
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924213
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
полудух, есть решение и без мьютекса, типа:

ну и нахрена это флажковая демократия, когда есть мьютексы?
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924215
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
ужос

Почитай хотя бы эту книжку 22075920 .
Никакого ужоса.)) Просто поток выбрасывается, а дальше это уже его личное дело. Иногда этого достаточно, и ничего больше не надо.
Но mutex и atomic изучаю.) С экземплами в инете плохо.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924219
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Dima T
ужос

Почитай хотя бы эту книжку 22075920 .
Никакого ужоса.)) Просто поток выбрасывается, а дальше это уже его личное дело. Иногда этого достаточно, и ничего больше не надо.

Ужос в том что иногда несколько потоков параллельно будут отрабатывать это место
Код: plaintext
1.
//делаем что нибудь


Но ты этого не понимаешь, т.к. книжки не хочешь читать, но уже изобретаешь велосипед с квадратными колесами.


Используй std::mutex. Он тоже может возвращаться если данные заняты std::mutex::try_lock()
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924222
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Ужос в том что иногда несколько потоков параллельно будут отрабатывать это место
Ну, ясно дело. В моем случае, не будут, чтобы так быстро. Но это другая задача, не в эту тему.
А доки по mutex и anomic читаю. Только этим и занят.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924234
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, книга неплохая. Оказалось, что она у меня на компе лежит. Когда-то начинал читать, но появились другие дела.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924256
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBAНикакого ужоса.))

"А втыкаешь - не работает." (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924291
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
class A
{
bool flag =false;
int DoIt()
{
if(flag) {return 1;};
flag = true;
//делаем что нибудь
flag = false;
return 0;
}


Представь два ядра процессора выполняющие этот код одновременно
Ядро 1 Ядро 2if(flag) {return 1;}if(flag) {return 1;}// flag пока false// flag пока falseflag = true;flag = true;
Когда такое случится, а оно когда-то случится, тут твоя прога даст неверный результат
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924300
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T, Да, я понимаю, но в моем случае одновременно не будет. Хотя, уже сейчас, сижу заменяю bool на atomic<bool> job =false; И потом проверка в if - compare_exchange_strong
Пусть будет.)
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924307
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Да, книга неплохая. Оказалось, что она у меня на компе лежит. Когда-то начинал читать, но появились другие дела.

читать надо вот эту версию, 2019 года, 2 редакция
там C++17 учтён
правда на англ.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924327
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут ещё такой момент:
YUBA

Код: plaintext
1.
2.
3.
//делаем что нибудь
//вылетаем по exception
//получаем deadlock


поэтому многопользовательские вещи, типа:
Код: plaintext
1.
2.
3.
flag = true;
//делаем что нибудь
flag = false;

надо делать конструкторах-деструкторах.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924333
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Dima T, Да, я понимаю, но в моем случае одновременно не будет. Хотя, уже сейчас, сижу заменяю bool на atomic<bool> job =false; И потом проверка в if - compare_exchange_strong
Пусть будет.)

Для твоего случая есть std::atomic_flag и метод test_and_set()

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class A
{
	std::atomic_flag lock = ATOMIC_FLAG_INIT;
public:
	int DoIt()
	{
		if (lock.test_and_set()) { return 1; };
		//делаем что нибудь
		lock.clear();
		return 0;
	}
};
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924347
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
...с совместным доступом к памяти решаются на уровне железа. Так ли это?...


Как сказано выше - тема межпроцессного взаимодействия многогранна. По синхронизации можно выделить несколько отдельных кучек
1) классика жанра - объекты синхронизации. предназначены для синхронного доступа к данным.
2) применение всевозможных оптимизаций, на объектах синхронизации, дабы избежать тяжеловесные вызовы объектов синхронизации. без практики предыдущего пункта - лезть сюда не стоит.
3) построение архитектуры взаимодействующих потоков таким образом чтоб минимизировать конфликт операций в местах синхронизации данных. без практики в предыдущих пунктах - лезть сюда не стоит.
4) оптимизация на уровне всего софта с привязкой к архитектуре софта и самого железа. лезть сюда без практики в предыдущих пунктах - не стоит.

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

как то так, удачи вам
(круглый)
ЗЫ
обычные флаги, слипы - это самое худшие варианты в данной теме...
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924447
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все решено, и написано. Завтра пробовать буду, если время будет. Вечером опубликую конкретные решения в нетленку.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39924720
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доступ к методу класса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
atomic<bool> job=false;
int A::Start(int i)
{
	bool b = false;
	if (!job.compare_exchange_strong(b,true)) { return 1; };
        // уходим в поток
        //job =false; уже в потоке.
        return 0;
};

Это уже работает.
Доступ к данным:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
mutex mtx;
void DC::Write(MData md)
	{
		lock_guard<mutex> guard(mtx);
		MD = md;
	};
MData DC::Read()
	{
		lock_guard<mutex> guard(mtx);
		return MD;
	};

Еще не доделано.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925359
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ознакомьтесь
YouTube Video
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925375
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Код: plaintext
1.
2.
3.
void DC::Write(MData md) {
		lock_guard<mutex> guard(mtx);
		MD = md;



Зачем тебе лишнее копирование md? Используй ссылку
Код: plaintext
1.
void DC::Write(MData& md)
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925434
YUBA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T

Зачем тебе лишнее копирование md? Используй ссылку
Код: plaintext
1.
void DC::Write(MData& md)

Там md определена в функциях, и ссылка исчезнет.)
Вот я думаю, стоит ли копировать структуры в поток (сейчас копирую) или читать напрямую по ссылке из защищенных мьютексами.
С одной стороны, возможны блокировки при чтении, с другой, данные обновляемые, и всегда актуальные.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925463
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA,
А что тут думать, если в варианте с мьютексами медленнее чем копировать.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925951
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YUBA
Имеется несколько потоков-писателей. Каждый из них изменяет свои переменные и тут все нормально. Писатели уже пишут.
Имеется несколько потоков-читателей. Каждый из них имеет доступ и может читать любые переменные.

Я уже почитал инет. Имхо, здесь ничего не нужно и все проблемы с совместным доступом к памяти решаются на уровне железа. Так ли это?

Нет, не так. Если поток пишет в переменную (по условию названную своей), но эту же переменную читает второй (по условию читаем любую), то нужно синхронизироваться.
...
Рейтинг: 0 / 0
Потоки. Разделяемые переменные.
    #39925963
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну янужно синхронизироваться.

За исключением случаев когда переменная размером не превышает разрядность платформы
И читающему коду всё равно которое из значений он получит.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Потоки. Разделяемые переменные.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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