Size: a a a

2020 October 14

D

Danya in pro.cxx
Можно ещё посмотреть не слишком ли всё ООПшно и можно ли что-то упростить
источник

OL

Oleg Linkin in pro.cxx
Liber Azerate
Просто надо обеспечить потокобезопасность
нет потоков - нет опасностей
источник

LA

Liber Azerate in pro.cxx
Oleg Linkin
нет потоков - нет опасностей
Тогда всё в порядке, да
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Я бы 10 раз подумал прежде чем так делать. В плюсах const на функции как правило означает, что ее безопасно вызывать из нескольких параллельных потоков.
Никогда такого не означало
источник

m

magras in pro.cxx
Побитый Кирпич
Никогда такого не означало
Это прекрасно когда в команде все высококлассные профессионалы, которые внимательно читают документацию (которой нет). А мне приходилось потом искать этот баг. Поэтому если класс может оказаться в многопоточном приложении, я бы без веских причин не стал скрывать потоконебезопасную ленивую инициализацию за const.
источник

S

Salt in pro.cxx
magras
Это прекрасно когда в команде все высококлассные профессионалы, которые внимательно читают документацию (которой нет). А мне приходилось потом искать этот баг. Поэтому если класс может оказаться в многопоточном приложении, я бы без веских причин не стал скрывать потоконебезопасную ленивую инициализацию за const.
Про конст и потокобезопасность все равно не понятно. В одном потоке вызывается метод с конст, в другом - без конст, и что дальше?
источник

S

Salt in pro.cxx
Или у вас там методы сеттера константные а члены класса mutable помечены с мьютексом
источник

m

magras in pro.cxx
Salt
Про конст и потокобезопасность все равно не понятно. В одном потоке вызывается метод с конст, в другом - без конст, и что дальше?
Я нигде не говорил о параллельном вызове const и не const. Очевидно, что так делать нельзя.
источник

S

Salt in pro.cxx
delete
источник

S

Salt in pro.cxx
Да, если класс только для чтения на всех потоках, ок
источник

m

magras in pro.cxx
К примеру тот баг состоял в следующем. Программа стартовала в однопоточном режиме и выполняла некоторую инициализацию. Потом запускался многопоточный рантайм. И где-то в логике дергался геттер на уже инициализированном объекте. Как позже выяснилось в геттере было кеширование без синхронизации.
источник

P

PRoSToC0der in pro.cxx
Danya
С++ с GC не является С++ даже по философской причине
там и RAII небось отсутствует?
источник

AS

Alex Sandrov in pro.cxx
А в c++ работы с xml ещё нету?
А будет?
Раньше пользовался boost::prpoery_tree, но вчера пришлось побегать с optional, разгоняя хедеры по разным углам проекта, и как-то мне это не нравится
источник

AS

Alex Sandrov in pro.cxx
хотя, если опциональные значения не использовать, optional можно и выкинуть, да, тогда проблем нет
источник

AS

Alex Sandrov in pro.cxx
а у меня ещё вопрос: using namespace std; в заголовочных файлах - это моветон? Вчера, гоняя xml по проекту, настраивал компилятор и словил проблему с std::byte, искал в интернете, и там была фраза, типа "кто-то почему-то вставил в заголовок using namespace std;"
источник

CD

Constantine Drozdov in pro.cxx
Переслано от Constantine Drozdov
Кратко: std::swap это конкретная функция из std, а просто swap - произвольная функция. Это разные синтаксические конструкции.
Вне рамок 100 строк кода (где просто лень писать буквы) правило очень простое: нужно определиться, хотите вы использовать конкретно std::swap или просто swap (скорее всего, примеры без std:: вам не будут встречаться достаточно долго).
Если хотите деталей - std::<name> это qualified name lookup, <name> это unqualified name lookup и разница вот в этом https://en.cppreference.com/w/cpp/language/adl

#stop_using_namespace_std
источник

AS

Alex Sandrov in pro.cxx
спасибо
источник

AF

Aidar Fattakhov in pro.cxx
magras
Это прекрасно когда в команде все высококлассные профессионалы, которые внимательно читают документацию (которой нет). А мне приходилось потом искать этот баг. Поэтому если класс может оказаться в многопоточном приложении, я бы без веских причин не стал скрывать потоконебезопасную ленивую инициализацию за const.
>искать
Должно заключаться в "запустить тесты с тсаном"
источник

G

GoodBye in pro.cxx
Продублировал вопрос с кодом в пастебин
https://pastebin.com/XUGMpUAz

[C] [epoll]
Я что-то делаю не дак, потому что events[sockIndex].events не соответствует установленному. Например если я ставил OUT, то то на следующей итерации у него стоит IN и наоборот

Структура pfds
struct SocketInfo
{
   int32_t fd;
   SocketStates state;
   struct epoll_event event;
};

struct epoll_event * events = NULL;
...
events = (struct epoll_event *)calloc(concurrencies, sizeof(struct epoll_event));

...

while ( runStatus == 1 )
{
 if ( concurrencies > 1 && avaliable_sockets > 0)
 {
   epoll_wait(epollfd, events, concurrencies, 0);
 }
 for ( sockIndex = 0; sockIndex < concurrencies; sockIndex += 1 )
 {
   ...
 }
}

Внутри цикла for switch case блок который смотрит на состояния сокетов.

typedef enum {
   STATE__NOTHING,
   STATE__CREATE,
   STATE__CONNECT,
   STATE__PROXY_INITIAL_SEND,
   STATE__PROXY_INITIAL_RECV,
   STATE__PROXY_CLIENT_SEND,
   STATE__PROXY_CLIENT_RECV,
} SocketStates;

Если STATE__CONNECT успешный
pfds[sockIndex].event.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
pfds[sockIndex].event.data.fd = pfds[sockIndex].fd;
epoll_ctl(epollfd, EPOLL_CTL_ADD, pfds[sockIndex].fd, &pfds[sockIndex].event);
avaliable_sockets += 1;

pfds[sockIndex].state = <STATE__NOTHING or STATE__PROXY_INITIAL_SEND>

Если состояние STATE__<...>_SEND успешно, то я делаю
pfds[sockIndex].state = STATE__PROXY_INITIAL_RECV;
if ( concurrencies > 1 )
{
   pfds[sockIndex].event.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
   pfds[sockIndex].event.data.fd = events[sockIndex].data.fd;
   epoll_ctl(epollfd, EPOLL_CTL_MOD, events[sockIndex].data.fd, &pfds[sockIndex].event);
}

Если состояние STATE__<...>_RECV успешно, то я делаю
pfds[sockIndex].state = STATE__PROXY_CLIENT_SEND;
if ( concurrencies > 1 )
{
   pfds[sockIndex].event.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
   pfds[sockIndex].event.data.fd = events[sockIndex].data.fd;
   epoll_ctl(epollfd, EPOLL_CTL_MOD, events[sockIndex].data.fd, &pfds[sockIndex].event);
}
источник

AM

Alexander Malkov in pro.cxx
Alex Sandrov
А в c++ работы с xml ещё нету?
А будет?
Раньше пользовался boost::prpoery_tree, но вчера пришлось побегать с optional, разгоняя хедеры по разным углам проекта, и как-то мне это не нравится
Советую посмотреть в сторону pugixml, быстрая, C++ библиотека, удобная
источник