SlideShare uma empresa Scribd logo
1 de 127
Baixar para ler offline
Lock-free	algorithms	for	
Kotlin	coroutines
It	is	all	about	scalability
Presented	at	SPTCC	2017
/Roman	Elizarov	@	JetBrains
Speaker:	Roman	Elizarov
• 16+	years	experience
• Previously	developed	high-perf	
trading	software	@	Devexperts
• Teach	concurrent	&	distributed	
programming	@	St.	Petersburg	
ITMO	University
• Chief	judge	@	Northeastern	
European	Region	of	ACM	ICPC	
• Now	work	on	Kotlin	@	JetBrains
Agenda
• Kotlin	coroutines	overview	&	motivation	for	lock-
free	algorithms
• Lock-free	doubly	linked	list
• Lock-free	multi-word	compare-and-swap
• Combining	them	to	get	more	complex	atomic	
operations (without	STM)
Kotlin	basic	facts
• Kotlin	is	a	JVM	language	developed	by	JetBrains
• General	purpose	and	statically-typed
• Object-oriented	and	functional	paradigms
• Open	source	under	Apache	2.0
• Reached	version	1.0	in	2016
• Compatibility	commitment
• Now	at	version	1.1
• Officially	supported	by	Google	on	Android
Kotlin	is	…
• Modern
• Concise
• Safe
• Extensible
• Pragmatic
• Fun	to	work	with!
Kotlin	is	pragmatic
… and	easy	to	learn
Coroutines
Asynchronous	programming	made	easy
How	do	we	write	code	that	waits	for	
something	most	of	the	time?
Blocking	threads
Kotlin fun postItem(item: Item) {
val token = requestToken()
val post = submitPost(token, item)
processPost(post)
}
fun postItem(item: Item) {
requestToken { token ->
submitPost(token, item) { post ->
processPost(post)
}
}
}
Callbacks
Kotlin
fun postItem(item: Item) {
requestToken()
.thenCompose { token ->
submitPost(token, item)
}
.thenAccept { post ->
processPost(post)
}
}
Futures/Promises/Rx
Kotlin
Coroutines
Kotlin fun postItem(item: Item) {
launch(CommonPool) {
val token = requestToken()
val post = submitPost(token, item)
processPost(post)
}
}
CSP	&	Actor	models
• A	style of	programming	for	modern	systems
• Lots	of	concurrent	tasks	/	jobs
• Waiting	most	of	the	time
• Communicating	all	the	time
Share	data	by	communicating
Kotlin	coroutines	primitives
• Jobs/Deferreds (futures)
• join/await
• Channels
• send	&	receive
• synchronous	&	buffered	channels
• Select/alternatives
• Atomically	wait	on	multiple	events
• Cancellation
• Parent-child	hierarchies
Implementation	challenges
• Coroutines	are	like	light-weight	threads
• All	the	low-level scheduling	&	communication	
mechanisms	have	to	scale to	lots	of	coroutines
Lock-free	algorithms
Building	blocks
• Single-word	CAS	(that’s	all	we	have	on	JVM)
• Automatic	memory	management	(GC)
• Practical lock-free	algorithms
• Lock-Free	and	Practical	Doubly	Linked	List-Based	
Deques Using	Single-Word	Compare-and-Swap
by	Sundell and	Tsigas
• A	Practical	Multi-Word	Compare-and-Swap	Operation	
by	Timothy	L.	Harris,	Keir	Fraser	and	Ian	A.	Pratt.
Doubly	linked	list
S
N
1
N
P
S
P
H T
sentinel sentinel
Use	same	node	in	practice
next links	form	logical	list	contents
prev links	are	auxiliary
Insert
PushRight (like	in	queue)
Doubly	linked	list (insert	0)
S
N
1
N
P
S
P
H T
2
N
P
create	&	init
1
2
Doubly	linked	list (insert	1)
S
N
1
N
P
S
P
H T
2
N
P
CAS
Retry	insert	on	CAS	
failure
Doubly	linked	list (insert	2)
S
N
1
N
P
S
P
H T
2
N
P
CAS
Ignore	CAS	failure
”finish	insert”
Remove
PopLeft (like	in	queue)
Doubly	linked	list	(remove	1)
S
N
1
N
P
S
P
H T
Mark	removed	node’s	
next link
Use	wrapper object	for	mark	in	practice
Cache	wrappers	in	pointed-to	nodes
CAS
Retry	remove	on	CAS	failure
1
2
Don’t	use	AtomicMarkableReference
CAS
Doubly	linked	list	(remove	2)
S
N
1
N
P
S
P
H T
Mark	removed	node’s	
prev link
Retry	marking	on	CAS	failure
”finish	remove”
Doubly	linked	list	(remove	3)
S
N
1
N
P
S
P
H T
CAS
”help	remove”	– fixup	next links
Doubly	linked	list	(remove	4)
S
N
1
N
P
S
P
H T
CAS
”correct	prev”	– fixup	prev links
State	transitions
Node	states
Init
next:	Ok
prev:	Ok
prev.next:	--
next.prev:	--
Insert	1
next:	Ok
prev:	Ok
prev.next:	me
next.prev:	--
Insert	2
next:	Ok
prev:	Ok
prev.next:	me
next.prev:	me
Remove	1
next:	Rem
prev:	Ok
prev.next:	me
next.prev:	me
Remove	2
next:	Rem
prev:	Rem
prev.next:	me
next.prev:	me
Remove	3
next:	Rem
prev:	Rem
prev.next:	++
next.prev:	me
Remove	4
next:	Rem
prev:	Rem
prev.next:	++
next.prev:	++
help	remove
correct	prev
correct	prev
1 2 3
4 5 6 7
Helping
Concurrent	insert
Concurrent	insert	(0)
S
N
1
N
P
S
P
H T
2
N
P
3
N
P
I2
I3
Concurrent	insert	(1)
S
N
1
N
P
S
P
H T
2
N
P
3
N
P
CAS	fail
CAS	ok
I2
I3
Concurrent	insert	(2)
S
N
1
N
P
S
P
H T
2
N
P
3
N
P
detect	wrong	prev
(t.prev.next !=	t)
I2
I3
Concurrent	insert	(3)
S
N
1
N
P
S
P
H T
2
N
P
3
N
P
correct	prev
I2
I3
Concurrent	insert	(4)
S
N
1
N
P
S
P
H T
2
N
P
3
N
P reinit &	repeat
I2
I3
Concurrent	remove
Concurrent	remove	(0)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
Concurrent	remove	(1)
S
N
1
N
P
S
P
H T2
N
P
R1
R1
R2
Concurrent	remove	(2)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
Finds	already	removed
R1
R2
Concurrent	remove	(3)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
help	remove
mark	prev
R1
R2
Concurrent	remove	(4)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
Retry	with	corrected	next
R1
R2
Concurrent	remove	(5)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
help	remove
R1
R2
Concurrent	remove	(6)
S
N
1
N
P
S
P
H T2
N
P
R1
R2
correct	prev
R1
R2
Concurrent	remove	&	
insert
When	remove	wins
Concurrent	remove	&	insert	(0)
S
N
1
N
P
S
P
H T
2
N
P
create	&	init
R1
R1
I2
Concurrent	remove	&	insert	(1)
S
N
1
N
P
S
P
H T
2
N
P
remove	first
R1
R1
I2
Concurrent	remove	&	insert	(2)
S
N
1
N
P
S
P
H T
2
N
P
CAS	fail
R1
R1
I2
Concurrent	remove	&	insert	(3)
S
N
1
N
P
S
P
H T
2
N
P
detect	wrong	prev
(t.prev.next -- removed)
do	“correct	prev”R1
R1
I2
Concurrent	remove	&	insert	(4)
S
N
1
N
P
S
P
H T
2
N
P
mark	prev
fixup	next
R1
R1
I2
Concurrent	remove	&	insert	(5)
S
N
1
N
P
S
P
H T
2
N
P
R1
R1
I2
update	prev
Concurrent	remove	&	insert	(6)
S
N
1
N
P
S
P
H T
2
N
P
R1
reinit &	repeat
R1
I2
Concurrent	remove	&	
insert
When	insert	wins
Concurrent	remove	&	insert	(0)
S
N
1
N
P
S
P
H T
2
N
P
create	&	init
R1
R1
I2
Concurrent	remove	&	insert	(1)
S
N
1
N
P
S
P
H T
2
N
P
R1
CAS
R1
I2
Concurrent	remove	&	insert	(2)
S
N
1
N
P
S
P
H T
2
N
P
R1
R1
I2
will	succeed	marking	on	remove	retry
Concurrent	remove	&	insert	(3)
S
N
1
N
P
S
P
H T
2
N
P
R1
help	remove
mark	prev
R1
I2
Concurrent	remove	&	insert	(4)
S
N
1
N
P
S
P
H T
2
N
P
R1
correct	prev
R1
I2
Remove	is	over!
Concurrent	remove	&	insert	(5)
S
N
1
N
P
S
P
H T
2
N
P
R1
correct	prev
R1
I2
Takeaways
• A	kind	of	algo you	need	a	paper	for
• Hard	to	improve	w/o	writing	another	paper
• Good	news:	stress	tests	uncover	most	impl bugs
• Bad	news:	when	stress	test	fails,	you	up	to	long	
hours
• More	bad	news:	hard	to	find	bugs	that	violate	lock-
freedomness of	algorithm
Summary:	what	we	can	do
• Insert	items	(at	the	end	of	the	queue)
• Remove	items	(at	the	front	of	the	queue)
• Traverse	the	list
• Remove	items	at	arbitrary	locations
• In	O(1)
Linearizability
• Insert	last
• Linearizes	at	CAS	of	next
• Remove	first	/	arbitrary
• Success	– at	CAS	of	next
• Fail	– at	read	of	head.next
More	about	algorithm
• Sundell &	Tsigas algo supports	deque operations
• Can	PushLeft &	PopRight
• PopLeft is	simple	– read	head.next &	remove
• But	cannot	linearize	them	all	at	cas points
• PushLeft,	PushRight,	PopRight - Ok
• PopLeft linearizes	at	head.next read	(!!!)
Summary	of	impl notes
• Use	GC	(drop	all	memory	management	details)
• Merge	head	&	tail	into	a	single	sentinel	node
• Empty	list	is	just	one	object	(prev &	next	onto	itself)
• One	item	+=	one	object
• Reuse	“remove	mark”	objects
• One-element	lists	reuse	of	ptrs to	sentinel	all	the	time
• Encapsulate!
S
N
P
1
N
P
Q
Mods
More	complex	atomic operations
Basic	mods	(1)
• Insert	item	conditionally	on	prev tail	value
S
N
1
N
P
S
P
H T
2
N
P
check	&	bailout	before	CAS
Basic	mods	(2)
• Remove	head	conditionally	on	prev head	value
S
N
1
N
P
S
P
H T
R1
check	&	bailout	before	CAS
Practical	use-case:	synchronous	
channels
val channel = Channel<Int>()
// coroutine #1
for (x in 1..5) {
channel.send(x * x)
}
// coroutine #2
repeat(5) {
println(channel.receive())
}
1
2
3
Senders	wait
Sender	#1H Sender	#2 Sender	#3 T
More	
senders
Incoming	
receivers
Receiver	removes	
first	if	it	is	a	sender	
node
Sender	inserts	last	if	it	
is	not	a	receiver	node
Receivers	wait
Receiver	#1H Receiver	#2 Receiver	#3 T
More	
receivers
Incoming	
senders
Sender	removes	
first	if	it	is	a	receiver	
node
Receiver	inserts	last	if	
it	is	not	a	sender	node
Send	function	sketch
fun send(element: T) {
while (true) {
// try to add sender, unless prev is receiver
if (enqueueSend(element)) break
// try to remove first receiver
val receiver = removeFirstReceiver()
if (receiver != null) {
receiver.resume(element) // resume receiver
break
}
}
}
1
2
3
4
Channel	use-case	recap
• Uses	insert/remove	ops	conditional	on	tail/head	
node
• Can	abort	(cancel)	wait	to	receive/send	at	any	time	
by	using	remove
• Full	removal	-- no	garbage	is	left
• Pretty	efficient	in	practice
• One	item	lists	– one	“garbage”	object
Multi-word	compare	and	
swap	(CASN)
Build	even	bigger	atomic	operations
Use-case:	select	expression
val channel1 = Channel<Int>()
val channel2 = Channel<Int>()
select {
channel1.onReceive { e -> ... }
channel2.onReceive { e -> ... }
}
Impl summary:	register	(1)
Select	
status:	NS
Channel1
Queue
Channel2
Queue
1. Not	selected
2. Selected
Impl summary:	register	(2)
Select	
status:	NS
Channel1
Queue
Channel2
Queue
Add	node	to	channel1	queue	if
not	selected	(NS)	yet	
N1
Impl summary:	register	(3)
Select	
status:	NS
Channel1
Queue
Channel2
Queue
Add	node	to	channel2	queue	if
not	selected	(NS)	yet	
N1 N2
Impl summary:	wait
Select	
status:	NS
Channel1
Queue
Channel2
Queue
N1 N2
Impl summary:	select	(resume)
Select	
status:	S
Channel1
Queue
Channel2
Queue
N1
Make	selected	and remove	node	
from	queue
Impl summary:	clean	up	rest
Select	
status:	S
Channel1
Queue
Channel2
Queue
Remove	non-selected	waiters	
from	queue
Double-Compare	
Single-Swap	(DCSS)
Building	block	for	CASN
DCSS	spec	in	pseudo-code
A B
fun <A,B> dcss(
a: Ref<A>, expectA: A, updateA: A,
b: Ref<B>, expectB: B) =
atomic {
if (a.value == expectA && b.value == expectB) {
a.value = updateA
}
}
1
2
3
4
DCSS:	init descriptor
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
DCSS:	prepare
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A B
CAS	ptr to	descriptor	if	a.value == expectA
expectA expectB
updateA
DCSS:	read	b.value
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A B
CAS	ptr to	descriptor	if	a.value == expectA
expectA expectB
updateA
DCSS:	complete	(when	success)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
CAS	to	updated	value	if	a	still	points	to	descriptor
DCSS:	complete	(alternative)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA !expectB
updateA
DCSS:	complete	(when	fail)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA !expectB
updateA
CAS	to	original	value	if	a	still	points	to	descriptor
DCSS:	States
Init
A:	???
(desc created)
A:	desc
A	was	expectA
prep	ok
A:	???
A	was	!expectA
prep	fail
one	tread
1 2
A:	updateA
B	was	expectB
success
A:	expectA
B	was	!expectB
4 5
fail
Any	other	thread	encountering	
descriptor	helps	complete
Originator	cannot	
learn	what	was	the	
outcome
Lock-free	algorithm	without	loops!
3
Caveats
• A	&	B	locations	must	be	totally	ordered
• or	risk	stack-overflow	while	helping
• One	way	to	look	at	it:	Restricted	DCSS	(RDCSS)
DCSS	Mod:	learn	outcome
A B
fun <A,B> dcssMod(
a: Ref<A>, expectA: A, updateA: A,
b: Ref<B>, expectB: B): Boolean =
atomic {
if (a.value == expectA && b.value == expectB) {
a.value = updateA
true
} else
false
}
DCSS	Mod:	init descriptor
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
Consensus
DCSS	Mod:	prepare
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
DCSS	Mod:	read	b.value
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
DCSS	Mod:	reach	consensus
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
Outcome:	SUCCESS
CAS(UNDECIDED,	
DECISION)
DCSS	Mod:	complete
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB)
A BexpectA expectB
updateA
Outcome:	SUCCESS
DCSS	Mod:	States
Init
A:	???
Outcome:	UND
(desc created)
A:	desc
Outcome:	UND
A	was	expectA
prep	ok
A:	???
Outcome:	FAIL
A	was	!expectA
prep	fail
one	tread
1 2
A:	desc
Outcome:	SUCC
B	was	expectB
success
A:	desc
Outcome:	FAIL
6
fail
A:	expectA
A:	updateA
5
7
Still	no	loops!
3
4
Compare-And-Swap	
N-words	(CASN)
The	ultimate	atomic	update
CASN	spec	in	pseudo-code
A B
fun <A,B> cas2(
a: Ref<A>, expectA: A, updateA: A,
b: Ref<B>, expectB: B, updateB: B): Boolean =
atomic {
if (a.value == expectA && b.value == expectB) {
a.value = updateA
b.value = updateB
true
} else
false
}
1
2
3
4
5
For	two	words,	for	simplicity
CASN:	init descriptor
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
updateB
CASN:	prepare	(1)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
updateBCAS
CASN:	prepare	(2)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	UNDECIDED
updateB
Use	DCSS	to	update	B	if
Outcome	==	UNDECIDED
DCSS
CASN:	decide
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	SUCCESS
updateB
CAS	outcome
CASN:	complete	(1)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	SUCCESS
updateB
CAS
CASN:	complete	(2)
DCSS	Descriptor
(a,	expectA,	updateA,
b,	expectB,	updateB)
A BexpectA expectB
updateA
Outcome:	SUCCESS
updateB
CAS
CASN:	States
A:	???
B:	???
O:	UND
A:	desc
B:	???
O:	UND
A:	desc
B:	desc
O:	UND
A:	updateA
B:	desc
O:	SUCC
Init
A:	updateA
B:	updateB
O:	SUCC
1 2 3
5
A:	desc
B:	desc
O:	SUCC
4
6
A:	???
B:	???
O:	FAIL
A	!=	expectA
A:	desc
B:	???
O:	FAIL
B !=	expectB
one	tread
A:	expectA
B:	???
O:	FAIL
7 8
9
DCSS
Prevents	from
going	back	in	this	SM
descriptor	is	known	to	other	(helping)	threads
Using	it	in	practice
All	the	little	things	that	matter
It	is	easy	to	combine	multiple	operations	
with	DCSS/CASN	that	linearize	on	a	CAS
with	a	descriptor	parameters	that	are	
known	in	advance
Trivial	example:	Treiber stack
1TOP 2
3 New	node
CAS
expect
update
Let’s	go	deeper
Into	unpublished	territory
Doubly	linked	list:	
insert	last
Operation	Descriptor
A	ref:	???
expectA:	Sentinel
updateA:	Node	#2
…
Outcome:	UNDECIDED
Doubly	linked	list:	insert	(0)
S
N
1
N
P
S
P
H T
2
N
P
CAS	here
We	know	expected	value	for	CAS	in	advance
We	know	updated	value	for	CAS	in	advance
???	can	fill	in	A	before	CAS	&	update	on	retry
DCSS	here	is	needed	(always!)
Doubly	linked	list:	insert	(1)
S
N
1
N
P
S
P
H T
2
N
P
Operation	Descriptor
A	ref:	???
expectA:	Sentinel
updateA:	Node	#2
…
Outcome:	UNDECIDED
DCSS	Descriptor
affected	node:	#1
operation	ref
Doubly	linked	list:	insert	(2)
S
N
1
N
P
S
P
H T
2
N
P
Operation	Descriptor DCSS	Descriptor
Helpers	are	a	bound	to	stumble	
upon	the	same	descriptor
CAS	can	only	succeed	on	last	node
Competing	inserts	will	
complete	(help)	us	first
affected	node:	#1
operation	ref
A	ref:	???
expectA:	Sentinel
updateA:	Node	#2
…
Outcome:	UNDECIDED
Doubly	linked	list:	insert	(3)
S
N
1
N
P
S
P
H T
2
N
P
Operation	Descriptor
desc is	updated	after successful	DCSS
A	ref:	Node	#1
expectA:	Sentinel
updateA:	Node	#2
…
Outcome:	UNDECIDED
DCSS	Descriptor
affected	node:	#1
operation	ref
Doubly	linked	list:	insert	(4)
S
N
1
N
P
S
P
H T
2
N
P
Operation	Descriptor
Stays	pointed	until	operation	
outcome	is	decided
A	ref:	Node	#1
expectA:	Sentinel
updateA:	Node	#2
…
Outcome:	UNDECIDED
Doubly	linked	list:
remove	first
Doubly	linked	list:	remove	(0)
S
N
1
N
P
S
P
H T
R1
CAS	here
2
N
P
Operation	Descriptor
A	ref:	???
expectA:	???
updateA:	Rem[???]
…
Outcome:	UNDECIDED
Both	not	known	in	advance
Deterministic	f(expectA)
Doubly	linked	list:	remove	(1)
S
N
1
N
P
S
P
H T
R1
2
N
P
Operation	Descriptor
A	ref:	???
expectA:	???
updateA:	Rem[???]
…
Outcome:	UNDECIDED
DCSS	Descriptor
affected	node:	#1
operation	ref
old	value:	#2
Doubly	linked	list:	remove	(2)
S
N
1
N
P
S
P
H T
R1
2
N
P
Operation	Descriptor
A	ref:	???
expectA:	???
updateA:	Rem[???]
…
Outcome:	UNDECIDED
It	locks	what	node	we	are	to	removeCannot	change	w/o	removal	of	#1
We	don’t	support	PushLeft!!!
DCSS	Descriptor
affected	node:	#1
operation	ref
old	value:	#2
Doubly	linked	list:	remove	(3)
S
N
1
N
P
S
P
H T
R1
2
N
P
Operation	Descriptor
A	ref:	Node	#1
expectA:	Node	#2
updateA:	Rem[#2]
…
Outcome:	UNDECIDED
desc is	updated	after successful	DCSS
DCSS	Descriptor
affected	node:	#1
operation	ref
old	value:	#2
Doubly	linked	list:	remove	(4)
S
N
1
N
P
S
P
H T
R1
2
N
P
Operation	Descriptor
A	ref:	Node	#1
expectA:	Node	#2
updateA:	Rem[#2]
…
Outcome:	UNDECIDED
Stays	pointed	until	operation	
outcome	is	decided
Closing	notes
• All	we	care	about	is	CAS that	linearizes	operation
• Subsequent	updates	are	helper moves
• Invoke	regular	help/correct	functions
• Perfect	algorithm	to	combine	with	optional	
Hardware	Transactional	Memory	(HTM)
Let’s	enjoy	what	we’ve	accomplished
References
• Kotlin	language
• http://kotlinlang.org
• Kotlin	coroutines	support	library
• http://github.com/kotlin/kotlinx.coroutines
Thank	you
Any	questions?
email	me	to	elizarov at	gmail
relizarov

Mais conteúdo relacionado

Mais procurados

Clean Architecture
Clean ArchitectureClean Architecture
Clean ArchitectureBadoo
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to GitlabJulien Pivotto
 
Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Young Kim
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kataPaul Blundell
 
Introducing type script
Introducing type scriptIntroducing type script
Introducing type scriptRemo Jansen
 
Angular & RXJS: examples and use cases
Angular & RXJS: examples and use casesAngular & RXJS: examples and use cases
Angular & RXJS: examples and use casesFabio Biondi
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIhabib_786
 
Typescript Fundamentals
Typescript FundamentalsTypescript Fundamentals
Typescript FundamentalsSunny Sharma
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...Doug Jones
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency InjectionTheo Jungeblut
 
HTML5 Local Storage
HTML5 Local StorageHTML5 Local Storage
HTML5 Local StorageLior Zamir
 
TypeScript Best Practices
TypeScript Best PracticesTypeScript Best Practices
TypeScript Best Practicesfelixbillon
 

Mais procurados (20)

TypeScript - An Introduction
TypeScript - An IntroductionTypeScript - An Introduction
TypeScript - An Introduction
 
Clean Architecture
Clean ArchitectureClean Architecture
Clean Architecture
 
TypeScript intro
TypeScript introTypeScript intro
TypeScript intro
 
Introduction to Gitlab
Introduction to GitlabIntroduction to Gitlab
Introduction to Gitlab
 
Git을 조금 더 알아보자!
Git을 조금 더 알아보자!Git을 조금 더 알아보자!
Git을 조금 더 알아보자!
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kata
 
Solid principles
Solid principlesSolid principles
Solid principles
 
Introducing type script
Introducing type scriptIntroducing type script
Introducing type script
 
Mono Repo
Mono RepoMono Repo
Mono Repo
 
Angular & RXJS: examples and use cases
Angular & RXJS: examples and use casesAngular & RXJS: examples and use cases
Angular & RXJS: examples and use cases
 
TypeScript Overview
TypeScript OverviewTypeScript Overview
TypeScript Overview
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Typescript Fundamentals
Typescript FundamentalsTypescript Fundamentals
Typescript Fundamentals
 
Git and Github Session
Git and Github SessionGit and Github Session
Git and Github Session
 
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
JavaScript: The Good Parts Or: How A C# Developer Learned To Stop Worrying An...
 
Clean Code II - Dependency Injection
Clean Code II - Dependency InjectionClean Code II - Dependency Injection
Clean Code II - Dependency Injection
 
Angular
AngularAngular
Angular
 
C# Async Await
C# Async AwaitC# Async Await
C# Async Await
 
HTML5 Local Storage
HTML5 Local StorageHTML5 Local Storage
HTML5 Local Storage
 
TypeScript Best Practices
TypeScript Best PracticesTypeScript Best Practices
TypeScript Best Practices
 

Semelhante a Lock-free algorithms for Kotlin coroutines using multi-word CAS

Repeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirRepeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirBarry Jones
 
TDD and the Legacy Code Black Hole
TDD and the Legacy Code Black HoleTDD and the Legacy Code Black Hole
TDD and the Legacy Code Black HoleNoam Kfir
 
Non blocking programming and waiting
Non blocking programming and waitingNon blocking programming and waiting
Non blocking programming and waitingRoman Elizarov
 
Python indroduction
Python indroductionPython indroduction
Python indroductionFEG
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and AbstractionsMetosin Oy
 
Future of Kotlin - How agile can language development be?
Future of Kotlin - How agile can language development be?Future of Kotlin - How agile can language development be?
Future of Kotlin - How agile can language development be?Andrey Breslav
 
C# Async/Await Explained
C# Async/Await ExplainedC# Async/Await Explained
C# Async/Await ExplainedJeremy Likness
 
Erlang factory SF 2011 "Erlang and the big switch in social games"
Erlang factory SF 2011 "Erlang and the big switch in social games"Erlang factory SF 2011 "Erlang and the big switch in social games"
Erlang factory SF 2011 "Erlang and the big switch in social games"Paolo Negri
 
Erlang, the big switch in social games
Erlang, the big switch in social gamesErlang, the big switch in social games
Erlang, the big switch in social gamesWooga
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8Heartin Jacob
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threadsmperham
 
Functional programming techniques in regular JavaScript
Functional programming techniques in regular JavaScriptFunctional programming techniques in regular JavaScript
Functional programming techniques in regular JavaScriptPavel Klimiankou
 
Rethinking the debugger
Rethinking the debuggerRethinking the debugger
Rethinking the debuggerIulian Dragos
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Metosin Oy
 
Real time system_performance_mon
Real time system_performance_monReal time system_performance_mon
Real time system_performance_monTomas Doran
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Andrei KUCHARAVY
 

Semelhante a Lock-free algorithms for Kotlin coroutines using multi-word CAS (20)

Repeating History...On Purpose...with Elixir
Repeating History...On Purpose...with ElixirRepeating History...On Purpose...with Elixir
Repeating History...On Purpose...with Elixir
 
Introduction to multicore .ppt
Introduction to multicore .pptIntroduction to multicore .ppt
Introduction to multicore .ppt
 
Haskell @ HAN Arnhem 2013-2014
Haskell @ HAN Arnhem 2013-2014Haskell @ HAN Arnhem 2013-2014
Haskell @ HAN Arnhem 2013-2014
 
TDD and the Legacy Code Black Hole
TDD and the Legacy Code Black HoleTDD and the Legacy Code Black Hole
TDD and the Legacy Code Black Hole
 
Non blocking programming and waiting
Non blocking programming and waitingNon blocking programming and waiting
Non blocking programming and waiting
 
Python indroduction
Python indroductionPython indroduction
Python indroduction
 
Performance and Abstractions
Performance and AbstractionsPerformance and Abstractions
Performance and Abstractions
 
SnW: Introduction to PYNQ Platform and Python Language
SnW: Introduction to PYNQ Platform and Python LanguageSnW: Introduction to PYNQ Platform and Python Language
SnW: Introduction to PYNQ Platform and Python Language
 
Future of Kotlin - How agile can language development be?
Future of Kotlin - How agile can language development be?Future of Kotlin - How agile can language development be?
Future of Kotlin - How agile can language development be?
 
Children of Ruby
Children of RubyChildren of Ruby
Children of Ruby
 
C# Async/Await Explained
C# Async/Await ExplainedC# Async/Await Explained
C# Async/Await Explained
 
Erlang factory SF 2011 "Erlang and the big switch in social games"
Erlang factory SF 2011 "Erlang and the big switch in social games"Erlang factory SF 2011 "Erlang and the big switch in social games"
Erlang factory SF 2011 "Erlang and the big switch in social games"
 
Erlang, the big switch in social games
Erlang, the big switch in social gamesErlang, the big switch in social games
Erlang, the big switch in social games
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8
 
Actors and Threads
Actors and ThreadsActors and Threads
Actors and Threads
 
Functional programming techniques in regular JavaScript
Functional programming techniques in regular JavaScriptFunctional programming techniques in regular JavaScript
Functional programming techniques in regular JavaScript
 
Rethinking the debugger
Rethinking the debuggerRethinking the debugger
Rethinking the debugger
 
Clojure in real life 17.10.2014
Clojure in real life 17.10.2014Clojure in real life 17.10.2014
Clojure in real life 17.10.2014
 
Real time system_performance_mon
Real time system_performance_monReal time system_performance_mon
Real time system_performance_mon
 
Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1Introduction to the intermediate Python - v1.1
Introduction to the intermediate Python - v1.1
 

Mais de Roman Elizarov

Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Roman Elizarov
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Roman Elizarov
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Roman Elizarov
 
Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017Roman Elizarov
 
Scale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOneScale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOneRoman Elizarov
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines ReloadedRoman Elizarov
 
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems ReviewRoman Elizarov
 
Многопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаМногопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаRoman Elizarov
 
Wait for your fortune without Blocking!
Wait for your fortune without Blocking!Wait for your fortune without Blocking!
Wait for your fortune without Blocking!Roman Elizarov
 
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems ReviewRoman Elizarov
 
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems ReviewRoman Elizarov
 
Why GC is eating all my CPU?
Why GC is eating all my CPU?Why GC is eating all my CPU?
Why GC is eating all my CPU?Roman Elizarov
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Roman Elizarov
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Roman Elizarov
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewRoman Elizarov
 
Java Serialization Facts and Fallacies
Java Serialization Facts and FallaciesJava Serialization Facts and Fallacies
Java Serialization Facts and FallaciesRoman Elizarov
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure javaRoman Elizarov
 
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems ReviewRoman Elizarov
 
The theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmerThe theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmerRoman Elizarov
 

Mais de Roman Elizarov (20)

Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018
 
Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017Deep dive into Coroutines on JVM @ KotlinConf 2017
Deep dive into Coroutines on JVM @ KotlinConf 2017
 
Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017Introduction to Coroutines @ KotlinConf 2017
Introduction to Coroutines @ KotlinConf 2017
 
Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017Fresh Async with Kotlin @ QConSF 2017
Fresh Async with Kotlin @ QConSF 2017
 
Scale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOneScale Up with Lock-Free Algorithms @ JavaOne
Scale Up with Lock-Free Algorithms @ JavaOne
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines Reloaded
 
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2016 NEERC (Northeastern European Regional Contest) Problems Review
 
Многопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и ПрактикаМногопоточное Программирование - Теория и Практика
Многопоточное Программирование - Теория и Практика
 
Wait for your fortune without Blocking!
Wait for your fortune without Blocking!Wait for your fortune without Blocking!
Wait for your fortune without Blocking!
 
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2015 NEERC (Northeastern European Regional Contest) Problems Review
 
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2014 NEERC (Northeastern European Regional Contest) Problems Review
 
Why GC is eating all my CPU?
Why GC is eating all my CPU?Why GC is eating all my CPU?
Why GC is eating all my CPU?
 
Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)Многопоточные Алгоритмы (для BitByte 2014)
Многопоточные Алгоритмы (для BitByte 2014)
 
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
Теоретический минимум для понимания Java Memory Model (для JPoint 2014)
 
DIY Java Profiling
DIY Java ProfilingDIY Java Profiling
DIY Java Profiling
 
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2013 NEERC (Northeastern European Regional Contest) Problems Review
 
Java Serialization Facts and Fallacies
Java Serialization Facts and FallaciesJava Serialization Facts and Fallacies
Java Serialization Facts and Fallacies
 
Millions quotes per second in pure java
Millions quotes per second in pure javaMillions quotes per second in pure java
Millions quotes per second in pure java
 
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems ReviewACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
ACM ICPC 2012 NEERC (Northeastern European Regional Contest) Problems Review
 
The theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmerThe theory of concurrent programming for a seasoned programmer
The theory of concurrent programming for a seasoned programmer
 

Último

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dashnarutouzumaki53779
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 

Último (20)

Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dash
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 

Lock-free algorithms for Kotlin coroutines using multi-word CAS