Это зависит от доступа к одному объекту сокета из нескольких потоков. Предположим, что у вас есть два потока, работающих с такой же функцией io_service::run()
.
Если, например, вы одновременно выполняете чтение и запись или можете выполнять операцию отмены из другого потока. Тогда это небезопасно.
Однако, если ваш протокол выполняет только одну операцию за раз.
io_service::run
, и вы пытаетесь сделать операции одновременно - скажем, отменить и прочитать операцию, тогда вы должны использовать пряди. В документации Boost.Asio есть учебное пособие. Почему бы не создать группу из двух прямоугольников? Примерно так:
var canvas = this.__canvas = new fabric.StaticCanvas('c');
var rectBack = new fabric.Rect({
width: 170,
height: 170,
top: 0,
left: 0,
fill: 'rgba(0,0,255,1.0)',
rx: 2,
ry: 2
});
var outerMargin = 10
var innerOutlineWidth = 4
var innerOutline = new fabric.Rect({
width: 170 - outerMargin - innerOutlineWidth/2,
height: 170 - outerMargin - innerOutlineWidth/2,
top: outerMargin/2,
left: outerMargin/2,
stroke: 'rgba(255,255,255,1.0)',
fill: 'rgba(0,0,0,0.0)',
strokeWidth: innerOutlineWidth,
rx: 10,
ry: 10
});
var group = new fabric.Group([rectBack, innerOutline], {
left: 0,
top: 0,
angle: 0
});
canvas.add(group);
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/2.7.0/fabric.min.js"></script>
<canvas id="c" width="200" height="200"></canvas>
Любая используемая вами структура будет иметь некоторые фундаментальные строительные блоки, которые вы должны собрать вместе чтобы получить то, что вы хотите. Поэтому я бы не рекомендовал переходить к другому.