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

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

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

Dark
19.05.2018
11:58:26

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
Просто во всех примерах делают глобальную переменную и начинают ее из двух потоков менять. Нафиг это в реалььной жизни не понятно.

Dark
19.05.2018
12:00:38
К примеру

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

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

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

Denis
19.05.2018
12:11:18

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/

Denis
19.05.2018
12:20:07

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, они остаются тредами

Dark
19.05.2018
12:34:49

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
Улучшили багу, теперь это фича

Denis
19.05.2018
12:43:51

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
просто два = в выражении замерптить
отдельной проверкой

Dark
21.05.2018
12:36: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

Denis
21.05.2018
13:03:49

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

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

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

Dark
21.05.2018
13:08:58

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

Dark
21.05.2018
14:19:15

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
ты чего то странного хочешь судя по коду )