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

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

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

Ну дак ты расскажешь зачем тебе полинг, либо так и продолжишь нести несвязную херню, игнорируя вопросы? Что ты им собрался делать? Сам не знаешь? Ли то, что я сообщил в своём первом комменте?

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

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

Похоже под полингом он понимает опрос на микроконтроллере наличие пришедшего пакета …

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

Да кого волнует что происходит на вашем домашнем десктопе?

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

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

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

А, и вот хороший пример - запустите игрушку какую-нибудь (doom, например, из последних), и посмотрите сколько они тредов форкают (операционка вам покажет)

треды не форкают, они все в едином адреспейсе и видят все что доступно текущему процессу. форкают процессы.

я в игрушки не играю. думаю дум запустит тредов 20. у кого есть дум - может попробовать и сообщить статистику.

И я, на самом деле, не понимаю что вы так в UI вцепились?

Я про UI вообще слова не сказал!!! а UI такая же подсистема, что и все прочие. Вот вы пишете в ЛОР не в командной же строке? Значит и у вас сотни тредов ждут своих ивентов,и вы такой же средний юзер, как и я.

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

треды не форкают

Вы видите принципиальную разницу между fork() и pthread_create()? Всё оно в том же clone() заканчивается. А так - устоявшийся жаргон, потому как «питред-креейтить» как-то не звучит.

а UI такая же подсистема, что и все прочие.

Не сказал бы. Чтобы писать UI мозги должны быть повёрнуты совсем по другому.

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

Всё оно в том же clone() заканчивается. А так - устоявшийся жаргон, потому как «питред-креейтить» как-то не звучит.

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

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

Всё оно в том же clone() заканчивается.

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

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

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

Батенька, вы с каждым разом всё больше и больше меня разочаровываете.

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

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

вы все время выступаете с какими-то «оценочными суждениями»

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

видимо будучи не в силах говорить по существу вопроса.

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

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

Чего я действительно не в силах делать, так это опускаться на ваш уровень

по существу вопроса есть хоть что-то? не думаю, что ваши рефлексии кого-то интересуют.

alysnix ★★★
()
Ответ на: комментарий от bugfixer
clone() является обобщением функций fork() и pthread_create().
Она позволяет вызывающему процессу указывать , какие рессурсы
он согласен делить с дочерним процессом.Необходимо также задать область памяти , в которой будет расположен стек выполнения нового
процесса.Вообще говоря , мы упоминаем функцию clone() лишь для того чтобы удовлетворить любопытство читателей.Использовать её в программах не следует.

Программирование для Линукс.
Марк Митчелл
Джеффри Оулдем
Алекс Самьюэл 

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

и если вы считаете, что имя функции однозначно свидетельствует о том, что она будет делать… то это ошибка.

ну вот есть функция copy и paste. их можно обьединить в одну, с параметром, специфицирующим что делать - копировать или пейстить…. но это не делает copy и paste - функционально одним и тем же.

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

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

Гхм. Как минимум оно недвусмысленно намекает что концепции создания треда и процесса это фундаментально близкие вещи. Вы же заявляли что (цитирую):

треды не форкают

а что клонить треду?

очевидно не имея ни малейшего представления как оно реально работает.

И еще, «последний гвоздик в крышку» так сказать - «форкать» можно всё что угодно, например проекты. Учите английский, а то вы даже с вашим уровнем знаний оного влезаете с советами в соседних ветках по поводу имён переменных / полей итд… Я то поначалу подумал что вы школьник / студент (и тогда многое из того что вы несёте было бы понятно / простительно), но как-то всё гораздо более печально по факту…

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

Как минимум оно недвусмысленно намекает что концепции создания треда и процесса это фундаментально близкие вещи.

не намекает. процесс имеет main тред, всего лишь.

процесс и переменные имеет. но это не значит, что процесс и переменная - фундаментально близки.

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

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

И еще, «последний гвоздик в крышку» так сказать - «форкать» можно всё что угодно, например проекты.

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

Учите английский, а то вы даже с вашим уровнем знаний оного влезаете с советами в соседних ветках по поводу имён переменных / полей итд…

а что не так? какие претензии?

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

проекты потому и «форкают»,

Вы тупо не слышите что вам говорят. До свидания.

а что не так? какие претензии?

Например в вашей интерпретации глагола to fork.

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

fork - это создание КОПИИ(смотрите ваши «форки проектов»).

а создание «копии треда» - это бессмыслица. ни один человек на этой планете треды не форкает. кроме вас.:)

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

а создание «копии треда» - это бессмыслица. ни один человек на этой планете треды не форкает. кроме вас.:)

Отдел взоржал. Спасибо. До свидания.

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