LINUX.ORG.RU

Data race

 ,


0

2

Санитайзер говорит о рейсах здесь, объясните мне пожалуйста - что здесь не так? Всё под мьютексом.

#include <mutex>
#include <thread>
#include <chrono>
#include <condition_variable>
#include <queue>
#include <memory>
using namespace std;

struct Mes {
	int data = 0;
	bool processed = false;
};

struct Test {
	mutex mtx;
	condition_variable cv;
	queue<weak_ptr<Mes>> mes_queue;
	int read();
	bool check();
} t;

int Test::read()
{
	auto sh_ptr = make_shared<Mes>();
	unique_lock lck{mtx};
	mes_queue.push(sh_ptr);
	while (! cv.wait_for(lck, 1s, [&sh_ptr](){
				return sh_ptr->processed == true;})  &&  true);
	return sh_ptr->data;
}

bool Test::check()
{
	scoped_lock lck{mtx};

	bool ret = mes_queue.size();
	while (mes_queue.size()) {
		if (shared_ptr<Mes> mes = mes_queue.front().lock()) {
			mes->data = 5;
			mes->processed = true;
		}
		mes_queue.pop();
	}
	cv.notify_all();
	return ret;
}

void read_th() {
	while (true) {
		t.read();
		this_thread::sleep_for(200ms);
	}
}

void check_th() {
	while (true) {
		t.check();
		this_thread::sleep_for(200ms);
	}
}

int main() {
	jthread tr{read_th};
	jthread tc{check_th};
}

$ g++ -pthread -std=c++20 -fsanitize=thread test.cc

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

★★
Ответ на: комментарий от alysnix

Как заявляют разработчики — они уходят от polling’a. Вот выдержка из письма от Константина Белоусова

вот это и надо читать

Так это и была выдержка из его интервью.
Ссылки в предыдущем посте …

anonymous
()
Ответ на: комментарий от anonymous

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

конкретная реализация - в виде нити или в виде поллинга - абсолютно не важна. в принципе суть подхода в том, чтоб совмещать много пакетов в одно «прерывание».

salozar
()
Ответ на: комментарий от salozar

для скоростных

По отклику на первый «пакет» (ping) или по пропускной способности?

anonymous
()
Ответ на: комментарий от anonymous

Вот прям, так сразу, игнорируя очередь более приоритетных активных задач?

все зависит от стратегии приоритетов. и того, как реализован планировщик. если ивент высокоприоритетный, или запускамый тред в данный момент выше всех приоритетом(среди активных и ожидающих данного ивента) - то сразу.

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

alysnix ★★★
()
Ответ на: комментарий от salozar

shared_ptr вообще-то не потоко-небезопасный.

В теории нет (насколько я знаю), на практике - да. Там на атомиках всё, по крайней мере во всех реализациях что я видел.

bugfixer ★★★★★
()
Ответ на: комментарий от anonymous

И какой ответ: поллить или не поллить?

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

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

исходные посылки то какие?

Такие же, когда ты решил безусловно отрубать руки за поллинг.

anonymous
()
Ответ на: комментарий от bugfixer

В теории нет (насколько я знаю), на практике - да.

нужно использоватьstd::atomic<std::shared_ptr>.

Об этом явно написано в стандарте: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0718r2.html

К сожалению на текущий момент только Visual C++ поддерживает это(с версии от 5 августа 2020г)

Вы можете помочь gcc и clang и реализовать это для них…

fsb4000 ★★★★★
()
Ответ на: комментарий от alysnix

надо понимать, как рантаймовый планировщик ставит треды в ожидание

Надо понимать что Вы не понимаете реалии современного железа. Я всё ещё жду решения гарантируещего ответа за 10мкс в 99.99% случаев, на сетевом интерфейсе.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

жду решения … на сетевом интерфейсе

Какой еще сетевой интерфейс? У него только «правильная» вытесняющая многозадачность на одном ядре центрального процессора

anonymous
()
Ответ на: комментарий от alysnix

исходные посылки то какие? какой хардвер вообще?

Вы реально не догоняете… Я Вам дам любое железо которое Вы только можете себе представить, под обещание уйти под 1мкс. Обещание придётся доказать.

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Ответ на: комментарий от bugfixer

Надо понимать что Вы не понимаете реалии современного железа. Я всё ещё жду решения гарантируещего ответа за 10мкс в 99.99% случаев, на сетевом интерфейсе.

сначала прочтите лекцию собравшимся про «реалии современного железа». я вот даже не понимаю, где у вас они начинаются, и где заканчиваются. начните вот с асиков для дешевых смартфонов, это будет хороший старт.

и потом… не надо мне давать «любое железо», я не цыган, и железо не собираю. дайте денюх разрабам на плис, они вам вашу латенси обеспечат левой ногой.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от alysnix

сначала прочтите лекцию собравшимся про «реалии современного железа». я вот даже не понимаю, где у вас они начинаются, и где заканчиваются. начните вот с асиков для дешевых смартфонов, это будет хороший старт.

Начну в простого. Вы хорошо себе представляете как выглядит современная «биржа», точнее «crossing engine»? Это всего лишь стойка серверов в соседнем шкафу. Доходит до того что кабели отматывают определенной длинны и прячут бухту в шкаф, дабы не дай бог у кого то не было competitive advantage…

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Вы хорошо себе представляете как выглядит современная «биржа», точнее «crossing engine»? Это всего лишь стойка серверов в соседнем шкафу.

так. продолжайте. в соседнем шкафу есть стойка серверов. это понятно.

и бухта кабелей! это внушает.

умеете вы заинтриговать слушателя.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от alysnix

Он тебе предлагает купить стойку рядом с биржей. Недорого!

anonymous
()
Ответ на: комментарий от alysnix

так. продолжайте. в соседнем шкафу есть стойка серверов. это понятно.

И опять уходим от ответа (что ожидаемо). Я хочу гарантированный ответ за 1мкс. И меня абс не е^wволнует как вы этого добьётесь. Бюджет на железо - в сотни тысяч уе. I’m all ears.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

И опять уходим от ответа (что ожидаемо).

я от ответа не ухожу. вы сказали про шкаф и бухту кабеля.

я пытаюсь прокинуть логический мостик от шкафа и бухты, к атомикам, барьерам и поллингу, но пока не получается.

может вы просто кабелем торгуете? это все что я могу себе представить логически пока.

alysnix ★★★
()
Ответ на: комментарий от alysnix

я пытаюсь прокинуть логический мостик от шкафа и бухты, к атомикам, барьерам и поллингу, но пока не получается.

Это в силу молодости.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

молодость проходит. а кабель это навсегда

К сожалению возраст это нечто irreversible. Тем не менее - жду ответа. И мне реально нужна моя микро секунда. Есть идеи? besides пресловутый mutex…

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Надо понимать что Вы не понимаете реалии современного железа.

@bugfixer, вы о том, что сетевые карты не все пакеты сразу отдают и нужен polling?

anonymous
()
Ответ на: комментарий от anonymous

вы о том, что сетевые карты не все пакеты сразу отдают и нужен polling?

Нет. Конкретно в этом контексте всё глубже.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

может вы просто кабелем торгуете? это все что я могу себе представить логически пока.

Вот исключительно этим и занимаюсь. Да. Кабелем торгую. На жизнь хватает, спасибо.

bugfixer ★★★★★
()
Ответ на: комментарий от anonymous

Где почитать или вы объясните …

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

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Просто задумайтесь - а что бы делали Вы, если бы стояла задача добиться минимально возможных latencies.

давно задумались. это называется прерывания. они же interrupts. контроллер прерываний появился в составе процессоров бог знает когда.

alysnix ★★★
()
Ответ на: комментарий от alysnix

давно задумались

Конкретно Ваши когнитивные способности вызывают, скажем так, серьезные вопросы. Может не стоило влезать, не?

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

смело!

Да что же Вы так, как чёрт из табакерки… Как там mutex поживает? Вы хотя бы отследили / осознали как он реализован?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Как там mutex поживает? Вы хотя бы отследили / осознали как он реализован?

а были беспокойства по поводу здоровья мьютекса???

вроде нет.

а что вас так тревожит с этим самым мьютексом? что с ним стряслось?

alysnix ★★★
()
Ответ на: комментарий от alysnix

а что вас так тревожит с этим самым мьютексом? что с ним стряслось?

Кто-то (не я) возвёл его в статус фундаментальных примитивов синхронизации. Это если память вдруг забарахлила… А так - вполне себе жизнеспособная вещь…

bugfixer ★★★★★
()
Ответ на: комментарий от fsb4000

Вы можете помочь gcc и clang и реализовать это для них…

Во первых - спасибки, не знал. Во вторых - ведь существующая реализация покрывает все real-life use-cases, no?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Кто-то (не я) возвёл его в статус фундаментальных примитивов синхронизации.

не не я. он как минимум стандартизован в posix_threads.

впрочем, вы можете еще раз публично заявить, что можно и без него и обойтись. и чем-то там заменить…

alysnix ★★★
()
Ответ на: комментарий от alysnix

впрочем, вы можете еще раз публично заявить, что можно и без него и обойтись. и чем-то там заменить…

Безусловно. Утверждение следующее: имея CAS + atomics + memory barriers можно реализовать всё остальное. Более того - именно так оно и работает. Жду аргументированную ответку.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

Жду аргументированную ответку.

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

вы слили вопрос переключения тредов и ожидания, сказав что это несущественно, а потом радостно ударились в поллинг.

alysnix ★★★
()
Ответ на: комментарий от alysnix

все уж было отвечено. решите задачу номер один

Вы ещё здесь? Почему?

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

TCP

А протокол нормальный купят, либо это такие игры для бедных и лоулетенси там чисто номинальная уровня битвы инвалидов?

anonymous
()
Ответ на: комментарий от bugfixer

И да, поподробнее. Где на этом этапе нужен поллинг? Для долбёжки буферов железяки? Это совершенно другой уровень. На уровне юзерпейса в каком месте нужен поллин? Это какие-то очередные сказки для бедных?

anonymous
()
Ответ на: комментарий от alysnix

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

Поэтому радуйся, но зачем ты пытаешься кукарекать что-то в адрес тех, кто тебя с руки кормит и благодаря кому ты не моешь полы? Обнови методичку.

anonymous
()
Ответ на: комментарий от anonymous

И да, поподробнее. Где на этом этапе нужен поллинг? Для долбёжки буферов железяки? Это совершенно другой уровень. На уровне юзерпейса в каком месте нужен поллин? Это какие-то очередные сказки для бедных?

чувак считает, что многопоток именно в юзерспейсе!!!, он способен реализовать на

 имея CAS + atomics + memory barriers можно реализовать всё остальное.

то есть без реализации планировщика, треда как абстракции, и регулярных обьектов синхронизации.

поскольку все эти его атомики, тредов переключать не умеют, и предназанчены для совсем другого, то нормальное ожидание, когда тред снимается с планировщика, становится неактивным и ожидающим, он предлагает выбросить, тред оставить активным!!! и заменить поллингом ивента!!!

на вопрос - а если тредов полно, все ждут, а ядро одно например!? следует немудреный ответ - а у меня 48 ядер!

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

потом идет рассказ, что у него серверная стойка в шкафу и бухта кабелей…

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

то есть - росой умылся, заново родился.

приехали, короче.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 2)
Ответ на: комментарий от alysnix

чувак считает, что многопоток именно в юзерспейсе!!!

Поаккуратнее. Вроде как на брудершафт не пили ещё. Правда, в Вашем случае, и не будем.

ПыСы: я могу поинтересоваться - что в вашем понятии «поток»?

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

то есть без реализации планировщика, треда как абстракции, и регулярных обьектов синхронизации.

Батенька. Вы реально… Я просто не знаю как вам это более наглядно продемонстрировать. Не обижайтесь.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

чувак считает, что многопоток именно в юзерспейсе!!!, он способен реализовать на

Правильно считает. Многопоток где-то за пределами юзерпейса - мусор для макак.

то есть без реализации планировщика, треда как абстракции, и регулярных обьектов синхронизации.

Никакие планировщики ненужны, если ты не пхп-макака. А если тебе они будут нужны - это делается в 10 раз более проще и быстрее и производительнее в юзерпейсе.

поскольку все эти его атомики, тредов переключать не умеют, и предназанчены для совсем другого, то нормальное ожидание, когда тред снимается с планировщика, становится неактивным и ожидающим, он предлагает выбросить, тред оставить активным!!! и заменить поллингом ивента!!!

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

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

anonymous
()
Ответ на: комментарий от alysnix

чувак считает, что многопоток именно в юзерспейсе!!!

Вы реально считаете что есть большая разница между kernel-space и user-space с точки зрения CPU? Помимо доступа etc.

bugfixer ★★★★★
()
Ответ на: комментарий от alysnix

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

Keltir
()
Ответ на: комментарий от alysnix

тредов переключать не умеют

Треды ненужно переключать. Если нужно - юзерспейс это может.

на вопрос - а если тредов полно, все ждут, а ядро одно например!? следует немудреный ответ - а у меня 48 ядер!

Твоя код - говно.

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

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

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

Ты такую же херню несёшь. Допустим, ты не знаешь как работает железо и не отличаешь реальную утилизацию и циферки для домохозяек. То, что там у тебя написано 100% потребления цпу - оно может жрать от нуля до дохрена ЭЭ.

Открою тебе тайну, но даже при полинке редко кто долбит циклом. Вернее дошколята, конечно же, об этом не знаю, но многие реализации знают. Там есть ноопы, есть специальные инструкции которые скипают десятки тактов. Таким образом 95% времени ядро ничего делать не будет, но будет написано 100% загрузки.

Ну говоря уже о том, что есть smt и пока оно там скипает такты другой тред получает 100% производительности ядра.

anonymous
()
Ответ на: комментарий от bugfixer

Вы реально считаете что есть большая разница между kernel-space и user-space с точки зрения CPU? Помимо доступа etc.

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

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

alysnix ★★★
()
Ответ на: комментарий от Keltir

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

Ну наконе-то! Хоть кто то озвучил. Теперь - а как spin lock эффективно сделать без CAS?

bugfixer ★★★★★
()
Последнее исправление: bugfixer (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.