@dlangru

Страница 576 из 719
Dmitry
19.05.2018
11:54:57
Я тут тему с многопоточностью курю. Правильно ли я понимаю. что траблы только на многопроцессорных системах есть, когда очень хочется второй поток запустить на другом ядре который что-либо делал

Denis
19.05.2018
11:55:20
многопроцессорных - многоядерных?

Dmitry
19.05.2018
11:57:20
а вот тут вопрос тоже

Google
Dmitry
19.05.2018
11:58:52
нет, порчу данных

Да и вообще как я понимаю даже в Python тhеды TLS. Почему данные могут портиться?

Dark
19.05.2018
11:59:22
нет, порчу данных
Порча данных в результате гонок и возникает, нет?

Dmitry
19.05.2018
11:59:28
Просто во всех примерах делают глобальную переменную и начинают ее из двух потоков менять. Нафиг это в реалььной жизни не понятно.

Dmitry
19.05.2018
12:04:12
Можешь более разврнуто ответить?

Dark
19.05.2018
12:06:51
Ну допустим у тебя один поток производит данные(producer), а второй их обрабатывает(consumer). Им нужен в общей видимости какой-то объект. Вот тут и начинаются проблемы, т.к. один поток может внезапно прерваться, что бы дать поработать второму

Dmitry
19.05.2018
12:09:19
Это только на многопроцессорных\ядерных системах такое возможно? Просто я не понимаю зачем больше одного потока на обработку когда только одно ядро

Dark
19.05.2018
12:11:26
Нет, на любой многозадачности

Объясню

Допустим, ты хочешь написать "abcd", ты пишешь "ab", но тут планировщик решает,что ты наработался и переключает на другой поток, который пишет "efgh", а потом снова передается управление тебе и ты дописываешь "cd".

Google
Dark
19.05.2018
12:14:31
Получается вместо "abcdefgh" - "abefghcd"

Что бы ты понял размах проблемы - https://habr.com/company/mailru/blog/354130/

Dark
19.05.2018
12:22:50
Denis
19.05.2018
12:23:25
ну вроде в Ди их запретили над shared

а в других языках - где как, в сишарпе атомарны, в си нет

вроде так

Dark
19.05.2018
12:25:23
а в других языках - где как, в сишарпе атомарны, в си нет
Про # интересно было бы подробнее услышать

Denis
19.05.2018
12:25:34
хз, я только мельком видел

там потому что виртуальная машина поэтому могут себе позволить атомарность

Dark
19.05.2018
12:27:46
Ах да, мы забыли про то, что неправильно решая состояние гонки, можем получить взаимоблокировку

Pavel
19.05.2018
12:32:49
Многопроцессорность тут ни при чем, треды это еще и абстракция. Хоть одно ядро хоть 20, они остаются тредами

Denis
19.05.2018
12:37:49
переделал

Dark
19.05.2018
12:40:51
Работает?

Pavel
19.05.2018
12:40:58
vibed вышел

Все так же наверно глючит :)

Пробовал пару дней назад, у меня сервер валится секунд через 10 с ассертом. Еще хуже стало.

Dark
19.05.2018
12:43:07
Улучшили багу, теперь это фича

Google
Dmitry
21.05.2018
11:45:40
А вы были в курсе? https://forum.dlang.org/post/xrkpuaopwodpmtxuelst@forum.dlang.org

Pavel
21.05.2018
11:47:30
Интересненько, ну это видимо сделано как проперти-сеттер

Denis
21.05.2018
11:58:40
я бы запретил

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

Pavel
21.05.2018
12:06:24
Ага

Ну это просто @property убрать надо)

Denis
21.05.2018
12:07:32
просто два = в выражении замерптить

отдельной проверкой

Ivan
21.05.2018
12:40:37
Ничего

Pavel
21.05.2018
12:42:24
В двойном присваивании не вижу, а вот то что можно writeln использовать как переменную для присваивания это очень плохо

Можно ведь и не догадаться что тут вывод идет

Pavel
21.05.2018
12:46:47
То есть отсутствие обязательности скобочек и функции как методы никого не смущают...

Pavel
21.05.2018
12:47:45
Ну вот я про скобочки и говорю тоже

Если хочется в программе найти все места где она печатает то делаешь поиск по write[f]ln(

... и он благополучно пропускает такие вот writeln = конструкции. Выглядит вообще как будто кто-то локально создал переменные writeln и iota и присвоил им 5 )

Dark
21.05.2018
12:50:19
Я вообще, редко использую writeln иначе как writeln(data)

Потому, что в противном случае выходит донельзя неочевидно

Pavel
21.05.2018
12:54:07
Что значит редко? Ты хотел сказать никогда? )

Google
Pavel
21.05.2018
12:54:21
Потому что я никогда не буду такое писать на трезвую голову

Denis
21.05.2018
13:01:15
А что плохого в двойном присваивании?
повышаетя сложность выражений на ровном месте

Dark
21.05.2018
13:02:06
Что значит редко? Ты хотел сказать никогда? )
Ну один раз писал, совесть не позволяет сказать, что никогда не писал

повышаетя сложность выражений на ровном месте
Я не про вызов сеттеров, а именно о присваивании. Иногда удобно и очевидно присвоить 2 переменным одно и то же значение

Dark
21.05.2018
13:04:43
например когда?
С ходу не скажу, редко нужна такая фича. А вообще, ничего плохого в этом нет

Denis
21.05.2018
13:05:03
есть, это вроде одна из тех фич которые сразу были выпилены

на этапе проектирования языка

Pavel
21.05.2018
13:07:15
Например когда обнуляешь счетчики counter = offset = 0

Denis
21.05.2018
13:18:05
да

Dark
21.05.2018
13:23:00
да
Странная логика

White_116
21.05.2018
13:45:15
Доброго времени суток. Как сравнить адрес класса с числом(другой адрес)? auto TC = new TestClass(); if(TC.ptr == 0x4444444)//...

Pavel
21.05.2018
13:47:00
У класса нет адреса, есть у объекта класса

Получить можно через &TC

White_116
21.05.2018
13:47:31
ага

так, а если я имею структуру: struct CTextDrawPool { //@disable this(); GlobalTextDraw [MAX_GLOBAL_TEXT_DRAWS] bSlotState;

и мне нужно выцепить значение в bSlotState[12]

Google
White_116
21.05.2018
14:03:14
причём GlobalTextDraw это класс.

Pavel
21.05.2018
14:04:03
ну myStruct.bSlotState[12]

Не понял в чем вопрос

White_116
21.05.2018
14:09:37
Error: function object.Object.opCmp(Object o) is not callable using argument types (int) cannot pass argument 1 of type int to parameter Object o

if(pNetGame.pTextDrawPool.bSlotState[tdid] > 1)

Dark
21.05.2018
14:12:34
И что?

Из ошибки все понятно

Pavel
21.05.2018
14:14:05
Так ты пытаешься сравнить объект с 1

А такой операции не предусмотрено

Dark
21.05.2018
14:16:08
А

Он указатели хочет сравнить

White_116
21.05.2018
14:17:21
https://run.dlang.io/is/IZUxI5

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

White_116
21.05.2018
14:19:40
мне именно значение нужно сравнить.

Pavel
21.05.2018
14:21:47
if(cast(ulong)&tts.tt[12] > 1)//

или if(&tts.tt[12] > cast(test*)1)//

White_116
21.05.2018
14:24:49
проблема выражения &tts.tt[12] в том, что он не возращает текущее значение в ячейке. По факту мне нужно сравнить *(&tts.tt[12])

Stanislav
21.05.2018
14:25:01
ты чего то странного хочешь судя по коду )

Страница 576 из 719