Павел Соколов, Без какого-то мьютекса этого не сделать. Им будет владеть или функтор, или кто-то кто хочет что-то другой.
Вообще, по описанию не понятно, почему вам не подходит просто мьютекс. Им или владеет поток с функтором, или кто-то другой, "взаимодействующий с членами функтора".
Если у вас потоков, исполняющих функтор, или "других" может быть много, но работать могут только или те или другие, то это делается с помощью трех мьютексов и пары счетчиков. что-то вроде RW lock
Если поток с функтором только один, то это в точности задача чтения-записи, когда читающих может быть много, а пишущий только один.
Можете задачу описать, которую вы решаете. Вот есть у вас несколько потоков. Что они должны делать? Не понятно, что вы счетчиком пытаетесь сделать. Просто начинать какую-то работу, когда счетчик ноль - не дает никаких гарантий.
A1ikse1, что это за данные? Правильно ли я понимаю, что регистрация была бы в данных с id 0, но ее нет. И эти точки с даты регистрации примерно линейно падают, пропуская какие-то айдишники?
Здесь, конечно, доля округления какая-то будет, но на сам алгоритм нахождения границ интервалов это повлиять не должно.
Нет, еще человек ожидает, что шкала равномерная в каком-то смысле. Или каждый цвет или одинаковый по размеру интервал покрывает, или в одинаковое количество раз больше. Если у вас один цвет будет 1-5, второй 6-7, третий 8-20 люди запутаются и ничего не поймут с вашей картинки.
MaxArgont, bit - макрос, его тип будет определятся типом операнда. где подставляется x - там будет u32. А там где key - u64. Это тупо пдстановка в исходнике тела bit вместо его "вызова". Обратите внимание, именно там, где bit "вернет" u64, стоит явное преобразование к u32, ибо все вычисления идут с u32.
AslHack, Черные линии должны идти к точкам пересечения прямой и окружности. Сектор - это треугольник с круглым дном - 2 черные линии и дуга коружности между ними.
Сегмент - это куски оркжности, на которое она разрезается горизонтальной прямой. Малый сегмент снизу, большой сверху.
AslHack, Эта формула для малго сегмента. Надо вот это вот из pi R^2 вычесть.
Чтобы площадь монте-карто искать, задаете квадрат вокруг круга (например [x0-R..x0+R]x[y0-R..y0+R]), случайно генерируете точку (пара координат в нужных границах), проверяете, что точка лежит внутри круга и по правильную сторону от прямой. Если да, то считаете точку в ответ. В итоге берете отношение правильных точек ко всем и умножаете на площадь квадрата (4R^2).
AslHack, Я вашу картинку не вижу. Это ссылка на файл на вашем компьютере, из интернета не доступна.
R надо давать, потому что только из точки центра неясно, насколько большая окружность. Она может быть совсем маленькая, может быть больше и касаться оси OX, Может быть еще больше и пересекать ее. Окружность может проходить вокруг точки начала координат, а может до нее не дотягиваться. Бесконечное количество вариантов.
AslHack, в смысле? 3 -1 это вы данные привели выше. Это центр окружности данный в задаче. Этот центр справа от осей, ниже горизонтальной. Отложите 3 отрезка вправо и один вниз. Или попросите chatgpt вам нарисовать. Это школа, 8 класс.
Нет. D - это расстояние от центра окружности до прямой. У вас на картинке оно 0. Но если бы окружность была выше, то вам бы надо было нарисовать точку - центр окружности, и опустить из нее перпендикуляр на прямую.
AslHack, Расстояние от окружности до прямой: D = |-3--1| = 2.
Формула угла на хорду на расстоянии D от центра окружности радиуса R: 2arcos(D/R) = 2arcos(2/3)=1.68213734 радиан
Площадь сектора: угол*R^2 =1.68213734*9 = 15.1392361
Площадь треугольника: sqrt(R*R-D*D)*D = sqrt(9-4)*2 = 2sqrt(5)=4.47213
Площадь малого сегмента: 15.1392361-4.47213=...
Площадь большого сегмента: PiR^2 - площадь малого сегмента.
Вообще, по описанию не понятно, почему вам не подходит просто мьютекс. Им или владеет поток с функтором, или кто-то другой, "взаимодействующий с членами функтора".
Если у вас потоков, исполняющих функтор, или "других" может быть много, но работать могут только или те или другие, то это делается с помощью трех мьютексов и пары счетчиков. что-то вроде RW lock
Если поток с функтором только один, то это в точности задача чтения-записи, когда читающих может быть много, а пишущий только один.